我正在尝试创建一个只需要一个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。上面的单行脚本有什么问题?
答案 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}}