Start-Process和Stop Parsing( - %)参数

时间:2016-09-06 18:02:40

标签: powershell escaping start-process

我无法让--%参数按预期工作。我的$TaskParams变量的字符'<'被powershell解释为重定向,因此需要进行转义。

但以下情况不起作用:

$CreateTask = Start-Process PowerShell.exe "$ScriptLocation --% $TaskParams" -Wait -PassThru

没有--%,当我手动删除任何'<'个字符时,它可以正常工作:

$CreateTask = Start-Process PowerShell.exe "$ScriptLocation $TaskParams" -Wait -PassThru

收到错误:

 Start-Process : A positional parameter cannot be found that accepts argument 
'--%'.

注意:我正在使用PS 5.0

我使用--%参数错了吗?任何帮助或指示表示赞赏。感谢

3 个答案:

答案 0 :(得分:4)

停止解析符号--%仅在直接调用可执行文件或使用调用操作符&时才有效;调用PowerShell脚本/函数/ cmdlet时不能使用它。

答案 1 :(得分:3)

如果你真的想使用Start-Process,你可以对参数进行编码,并按原样运行。在提升过去的UAC时,我会使用类似的东西:

$Code = ". '$ScriptLocation' $TaskParams"
$Encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code))

Start-Process PowerShell.exe -ArgumentList "-EncodedCommand",$Encoded -Wait -PassThru

我相当肯定会完成你想要的东西。

答案 2 :(得分:3)

您无需启动powershell.exe的新副本或使用Start-Process从另一个脚本中运行脚本。只需将脚本命令及其参数作为一行放在另一个脚本中。例如,假设您有script2.ps1:

param(
  [String] $Name
)
Write-Host "Hello, $Name"

现在假设您还有script1.ps1:

Write-Host "This is script1.ps1"
.\Script2.ps1 -Name "Bill Stewart"
Write-Host "script1.ps1 is finished"

如果您现在运行script1.ps1:

PS C:\> .\Script1.ps1
This is script1.ps1
Hello, Bill Stewart
script1.ps1 is finished