2017-01-13 3 views
1

Я пытаюсь создать однострочный скрипт powershell, который просто запрашивает URL-адрес. Скрипт работает нормально, когда я запускаю его как ps1 файл:ошибка синтаксического анализа в однострочном скрипте powershell

Файл "Test.ps1":

$webclient=New-Object "System.Net.WebClient" 
$data=$webclient.DownloadString("https://google.com") 

я запускаю этот скрипт в PS консоли, как это:

PS C:\test.ps1 -ExecutionPolicy unrestricted 

Это работает без проблем, но когда я пытаюсь запланировать этот скрипт и сделать его однострочным в соответствии с these recommendations, т.е. заменить "" на '' и отдельные команды с ; так что результат будет:

одна линия:

powershell -ExecutionPolicy unrestricted -Command "$webclient=New-Object 'System.Net.WebClient'; $data=$webclient.DownloadString('https://google.com');" 

Тогда я получил следующую задачу:

Ошибка:

The term '=New-Object' is not recognized as the name of a cmdlet, function, script file, or operable program

Я попробовал другой сценарий, который также отлично работает как файл ps1, но не работает как однострочный:

$request = [System.Net.WebRequest]::Create("https://google.com") 
$request.Method = "GET" 
[System.Net.WebResponse]$response = $request.GetResponse() 
echo $response 

одна линия:

powershell -ExecutionPolicy unrestricted -Command "$request = [System.Net.WebRequest]::Create('https://google.com'); $request.Method = 'GET'; [System.Net.WebResponse]$response = $request.GetResponse(); echo $response" 

Ошибка:

Invalid assignment expression. The left hand side of an assignment operator needs to be something that can be assigned to like a variable or a property. At line:1 char:102

get-host По команде у меня есть Powershell v 2.0. В чем проблема с однострочными скриптами выше?

+0

'... -command PowerShell "& {$ WebClient = ...}"' –

+0

@AnsgarWiechers Спасибо, но, к сожалению, назвать оператор (&) не помогло мне в В этом случае я получаю те же ошибки:/ –

+0

Это потому, что вы используете командную строку из PowerShell вместо того, чтобы запускать ее как запланированную задачу, как вы сказали. Если вам нужно запустить его из интерактивной консоли, используйте CMD для эмуляции среды, которая больше похожа на то, что у вас есть с запланированной задачей. –

ответ

2

Помещенного заявление вы хотите запустить в ScriptBlock и запустить этот ScriptBlock с помощью оператора вызова:

powershell.exe -Command "&{$webclient = ...}" 

Обратите внимание, что расклеивание этой командной строки в консоль PowerShell будет производить обманчивую ошибку, потому что PowerShell (тот в который вы вставляете командную строку) расширяет (неопределенные) переменные в строке до нулевых значений, которые затем автоматически преобразуются в пустые строки. Если вы хотите протестировать такую ​​командную строку, запустите ее из CMD, а не PowerShell.

Возможно, было бы неплохо иметь выход сценария с кодом состояния, например.

&{...; exit [int](-not $?)} 

или

&{...; $status=$response.StatusCode.value__; if ($status -eq 200) {exit 0} else {exit $status}} 
+0

Хорошие советы и объяснения, но знаете ли вы, почему попытка OP не работала, почему необходимо использовать блок сценариев? Мне кажется, что проблемы ОП были связаны только с запуском команд в PS, где произошло преждевременное изменение переменной. – mklement0

+1

@ mklement0 Ошибка действительно была вызвана вставкой командной строки с помощью строки с двумя кавычками в PowerShell. Я думаю, что использование '& {...}' было необходимо, если вы хотели запустить более одного оператора с PowerShell v2, но я не могу ручаться за это. Если бы это было так, это больше не требуется для более поздних версий, но я не знаю, когда именно это было изменено, и я предпочитаю использовать оболочку scriptblock в любом случае, просто чтобы быть в безопасности. –

+0

Для тех из вас, кто получил ошибку SSL при запуске сценария выше - проверьте answer http://stackoverflow.com/a/9918045/2021224, просто добавив строку «[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true} "помог мне достичь цели. –

Смежные вопросы