【问题标题】:parse error in one-line powershell script解析单行 powershell 脚本中的错误
【发布时间】:2017-01-13 12:37:01
【问题描述】:

我正在尝试创建一个仅请求 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 安排此脚本并使其成为单行时,即用'' 替换"" 并用; 分隔命令,结果将是:

单行:

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

然后我遇到了以下问题:

错误

术语“=New-Object”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序

我尝试了另一个脚本,它也可以作为 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"

错误:

无效的赋值表达式。作业的左侧 运算符必须是可以分配给变量的东西 或财产。在 line:1 char:102

根据get-host 命令我有powershell v 2.0。上面的一行脚本有什么问题?

【问题讨论】:

  • powershell ... -Command "&{$webclient = ...}"
  • @AnsgarWiechers 谢谢,但不幸的是,在这种情况下调用运算符 (&) 对我没有帮助,我得到了同样的错误:/
  • 那是因为您是从 PowerShell 运行命令行,而不是像您说的那样将其作为计划任务运行。如果您需要从交互式控制台运行它,请使用 CMD 模拟一个更类似于计划任务的环境。
  • 是的,你是对的!它在 powershell 中不起作用,但在 cmd 中起作用。我认为在哪里测试脚本并不重要。太感谢了!如果您希望我将此问题标记为已解决,请复制您的第一条评论作为答案。

标签: powershell powershell-2.0


【解决方案1】:

将您要运行的语句放在一个脚本块中,并通过调用运算符运行该脚本块:

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

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

让脚本块退出并带有状态码也是一个好主意,例如

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

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

【讨论】:

  • 很好的建议和解释,但你知道为什么 OP 的尝试没有奏效,为什么需要使用脚本块吗?在我看来,OP的问题仅源于在PS中运行命令,您描述的过早的变量扩展发生了。
  • @mklement0 该错误确实是由将带有双引号字符串的命令行粘贴到 PowerShell 中引起的。我认为如果您想使用 PowerShell v2 运行多个语句,则需要使用 &{...},但我不能保证这一点。如果是这样,更新的版本似乎不再需要它,但我不知道它是什么时候改变的,而且我更喜欢使用 scriptblock 包装器,只是为了安全起见。
  • 对于那些在运行上述脚本时遇到 SSL 错误的人 - 检查答案 stackoverflow.com/a/9918045/2021224,只需添加一行“[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}”帮助我实现了目标。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2020-10-07
  • 2017-01-18
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多