Вывод ошибок сценария Powershell

#powershell #windows-10

#powershell #windows-10

Вопрос:

Я ссылался на многие темы на этом и других форумах, но не смог заставить этот скрипт работать в форме скрипта в ps или в файле bat или cmd.

Эти команды работают в PowerShell в интерактивном режиме

Код PowerShell:

 #save creds
$creds=Get-Credential -Credential npjcho

#create session
$session = New-CimSession –ComputerName "server-a.np.domainx.com", "server-b.np.domainx.com" -Credential $creds

#query the data needed.
Get-CimInstance -ClassName win32_operatingsystem -CimSession $session | select csname, lastbootuptime
 

Код пакетного файла Windows / CMD:

 powershell -noexit "amp; ""C:UsersjchoDownloadsremote_host_reboot_time.ps1"""
pause
 

Сообщение об ошибке:

 C:UsersjchoDownloads>powershell -noexit "amp; ""C:UsersjchoDownloadsremote_host_reboot_time.ps1"""
At C:UsersjchoDownloadsremote_host_reboot_time.ps1:5 char:101
  ... rver-a.np.domainx.com", "server-b.np.domainx.com" -Credential $creds
                                                       ~~~~~~~~~~~~~~~~~~~~
The string is missing the terminator: ".
      CategoryInfo          : ParserError: (:) [], ParseException
      FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
 

Версии ОС и PS:

 Window 10
PS Version : 5.1.18362.1171
 

Когда я запускаю эти 3 команды PS в интерактивном режиме, я получаю следующий вывод, который я ожидаю от файлов сценариев

Хороший результат:

 csname        lastbootuptime
------        --------------
server-a  12/13/2019 12:30:37 AM
server-b  12/12/2019 12:01:53 AM
 

Я с удивлением вижу, что Windows powershell была сделана настолько запутанной для сценариев / использования.

Комментарии:

1. Почему бы не запустить файл PS1 через powershell -File C:UsersjchoDownloadsremote_host_reboot_time.ps1 У меня такое чувство, что способ, которым вы его выполняете, используя двойные кавычки, и amp; оператор вызывает ваши проблемы.

2. Неважно, это не вызывает вашей проблемы, я смог воссоздать ее на своем компьютере.

Ответ №1:

Похоже, проблема связана с кодировкой символов. Это всегда досадная ошибка для устранения неполадок, потому что все всегда «выглядит» нормально.

Вот как вы можете определить проблему для вашего конкретного сценария:

Откройте свой скрипт в notepad (или в вашем любимом редакторе, но я использую notepad ).

Затем в меню «Кодирование» выберите «ANSI». Вы увидите, что в вашем случае дефис в «имя_компьютера» не является стандартным дефисом ASCII. Вероятно, это связано с тем, что вы скопировали свой скрипт из другого места.

Например, когда я копирую ваш скрипт в файл UTF-8 в notepad , затем переключаю кодировку на ANSI, я вижу это:

 New-CimSession –ComputerName
 

Когда я ищу шестнадцатеричный код для – , то есть E28093 , я нахожу, что это:

Символ Unicode короткое ТИРЕ (U 2013) https://www.fileformat.info/info/unicode/char/2013/index.htm

Комментарии:

1. Спасибо, Чад — я знал, что в этих строках что-то не так, но не был уверен, как мне это сделать, к счастью, я использую Notedpad , поэтому смог исправить это и его работу

2. Отлично сделано. Тире и одинарные / двойные кавычки являются частой причиной копирования / вставки

3. Длинные тире, тире и «умные» кавычки — все это распространенные проблемы с повреждением символов. Это часто вызывается Microsoft Word и другими программами для обработки текстов, но другие виды чрезмерно умных программ также могут быть источником этих проблем.

4. @BoogaRoo по крайней мере, с помощью интеллектуальных кавычек вы можете _условно_ визуально идентифицировать их. Хуже всего обстоят дела в подобных случаях, когда «короткое тире» выглядит так же, как обычное тире. Как разработчик базы данных, это проклятие моего существования, лол.