在单行PowerShell脚本中解析错误

时间:2017-01-13 12:37:02

标签: powershell powershell-v2.0

我正在尝试创建一个只需要一个url的单行PowerShell脚本。当我将它作为ps1文件运行时,脚本工作正常:

文件“test.ps1”

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

我在PS控制台中运行此脚本,如下所示:

PS C:\test.ps1 -ExecutionPolicy unrestricted

这样运行没有任何问题,但是当我尝试安排此脚本并根据these recommendations使其成为一行时,即将""替换为''并使用{{分隔命令1}}所以结果将是:

单行:

;

然后我遇到了以下问题:

错误

  

术语'= New-Object'未被识别为cmdlet的名称,   功能,脚本文件或可操作程序

我尝试了另一个脚本也可以正常用作ps1文件,但不能用作单行代码:

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

单行:

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

错误:

  

无效的作业表达式。作业的左侧   运算符需要是可以像变量一样分配的东西   或财产。在行:1字符:102

根据powershell -ExecutionPolicy unrestricted -Command "$request = [System.Net.WebRequest]::Create('https://google.com'); $request.Method = 'GET'; [System.Net.WebResponse]$response = $request.GetResponse(); echo $response" 命令,我有powershell v 2.0。上面的单行脚本有什么问题?

1 个答案:

答案 0 :(得分:2)

将要运行的语句放在scriptblock中,并通过调用运算符运行该scriptblock:

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

请注意,将此命令行粘贴到PowerShell控制台会产生误导性错误,因为PowerShell(粘贴命令行的那个)会将字符串中的(未定义的)变量扩展为空值,然后将其自动转换为空字符串。如果要测试这样的命令行,请从CMD而不是PowerShell运行它。

让scriptblock退出状态代码也是一个好主意,例如

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

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