Неожиданный символ при выполнении файла .ps1 с использованием PuTTY Plink - PullRequest
0 голосов
/ 17 сентября 2018

Я удаленно выполняю некоторые скрипты для получения информации с сервера, используя инструмент Plink из putty.Проблема возникает, когда я использую файл .ps1, потому что один '?'появляется в начале, что делает первую строку неправильной, но с файлами .bat работает как нужно.

Например, я хочу напечатать содержимое файла:

GetDate.bat:

type C:/Data/DateOfCompilation.txt

А потом:

PS C:/Users/MyUser> plink -ssh <User>@<IP> -i C:\Key.ppk -m C:\Scripts\GetDate.bat
10/09/2018 14:32:02,72

Все в порядке

GetDate.ps1:

Get-Content -Path C:/Data/DateOfCompilation.txt

Выполнение:

PS C:/Users/MyUser> plink -ssh <User>@<IP> -i C:\Key.ppk -m C:\Scripts\GetDate.ps1

?Get-Content : The term '?Get-Content' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of 
the name, or if a path was included, verify that the path is correct and try 
again. At line:1 char:1 

+ ?Get-Content -Path C:/Data/DateOfCompilation.txt
+ ~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (?Get-Content:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Также, если я добавлю больше кода, остальные строки будут работать нормально, это просто первая ошибка, с которой '?' добавлено в начале.

(Тем не менее, при локальном запуске скрипт работает нормально)

У меня есть другие сценарии PS1, гораздо более расширенные, поэтому использование только bat-файлов не лучший вариант.

Iпосмотрел документацию, другие форумы и здесь, но я ничего не могу найти.Может быть, я ничего не знаю о файлах PS1.

1 Ответ

0 голосов
/ 17 сентября 2018

Проверьте, есть ли спецификация UTF-8 в начале GetDate.ps1 - Если есть, удалите ее.


Хотя основной причиной вашей проблемы может быть ваше неправильное понимание того, что делает -m переключатель Plink. Это заставляет Plink прочитать файл и отправить его содержимое (и только содержимое) на сервер. Сервер никогда не узнает, что такое расширение файла. Так что нет смысла использовать .ps против .bat. Независимо от того, что расширение, файл будет интерпретироваться оболочкой по умолчанию вашего Windows SSH-сервера. Что такое PowerShell (согласно сообщению об ошибке).

Таким образом, даже ваша команда type в файле .bat была выполнена PowerShell, а не cmd.exe. В PowerShell type является псевдонимом Get-Content.

Причина того, что ваш файл .bat работает, скорее всего, в том, что у него нет спецификации, а у вашего .ps1 есть спецификация. Если бы вы выполнили свой .ps1 с PowerShell, он бы правильно обрабатывал спецификацию. Но вы не выполняете .ps1 с PowerShell, вы выполняете его содержимое, и в этом случае спецификация, вероятно, вызывает проблемы.

Разница в основном такая:

powershell.exe -File GetDate.ps1

и

powershell.exe < GetDate.ps1

Обе программы в основном одинаковы, но последняя не справляется с спецификацией, а первая обрабатывает ее правильно.

...