为什么尾随反斜杠会中断Powershell参数解析?

为什么尾随反斜杠会中断Powershell参数解析?,powershell,parameters,quoting,Powershell,Parameters,Quoting,我一直在绞尽脑汁想弄清楚为什么Powershell忽略了一个命令行参数,我想我最终发现字符串参数后面的反斜杠会混淆参数解析 我有 param ( [Parameter(Mandatory=$true)][String]$p1, [Parameter(Mandatory=$true)][String]$p2 ) Write-Output "p1:$p1, p2:$p2" 最后,我需要从Windows任务调度器中调用类似的东西,这意味着使用powershell.exe作为程序,并

我一直在绞尽脑汁想弄清楚为什么Powershell忽略了一个命令行参数,我想我最终发现字符串参数后面的反斜杠会混淆参数解析

我有

param (
    [Parameter(Mandatory=$true)][String]$p1,
    [Parameter(Mandatory=$true)][String]$p2
)

Write-Output "p1:$p1, p2:$p2"
最后,我需要从Windows任务调度器中调用类似的东西,这意味着使用
powershell.exe
作为程序,并将此脚本和参数添加为参数

在生产环境中,p1是一个文件路径。所以我试着:

PS C:\source> C:\Windows\System32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -File  .\myScript.ps1 -p1 'C:\Program Files\' -p2 asdf

cmdlet myScript.ps1 at command pipeline position 1
Supply values for the following parameters:
p2:
为什么提示?参数就在那里。我最终无意中删除了p1的尾部反斜杠:

PS C:\source> C:\Windows\System32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -File  .\myScript.ps1 -p1 'C:\Program Files' -p2 asdf
p1:C:\Program Files, p2:asdf
这是一个bug吗?

这在cmd(双反斜杠和双引号)中对我有效。我猜反斜杠是powershell命令行选项的转义字符

C:\Windows\System32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -file .\myScript.ps1 -p1 "C:\Program Files\\" -p2 asdf

p1:C:\Program Files\, p2:asdf

反斜杠过去是一个转义符。所以,如果你把它放在一个有特殊含义的字符前面,它就破坏了这个含义。@Olaf我认为在powershell中,```是转义字符,即使在
-字符串中,它们也不起作用。在Chris的shell已经将其作为输入输入输入之后,新命名的powershell是否重新解释了这些参数?@Hashbrown这是一个转义字符,而不是。背景是另一个。当您注意语法突出显示时,甚至可以看到它。在第二个示例中,第二个单引号后的颜色发生变化。首先,它不是。在js2010下面的答案中,您可以看到,摆脱转义字符只会解决问题。;-)@Olaf我真的希望情况不是这样,这会将pwsh推回到cmd的黑暗时代,并使用不一致的转义规则。这也许能解决问题,但问题是为什么。我现在可以在pwsh终端中执行
echo'bob\
,甚至
powershell-ExecutionPolicy Bypass-Command echo'bob\
,它会打印
bob\
,所以我甚至没有看到Chris的问题。这是在PSVersion 5.1.17134.858中出现的,可能只有在调用
-文件时才会发生?我希望解释一下。简而言之:PowerShell在幕后用双引号重新引用在Windows PowerShell中被破坏,但在PowerShell[Core]中已经修复。