我有一个接受这样的参数的工具(例如在test.ps1
中):
foo.exe -name="john"
因此,每个参数都使用单个连字符-
,名称,等于=
,然后指定参数的值。
当我从PowerShell调用这个确切的表达式时,它会毫无问题地执行。但是,当其中一个值包含这样的句点.
时:
foo.exe -name="john.doe"
运行它会导致语法错误:
$ ./test.ps1字符串开头:At test.ps1:1 焦炭:24 + foo.exe -name =“john.doe<<<<”缺少终结符:“。在test.ps1:1 焦炭:25
+ foo.exe -name =“john.doe”<<<<
+ CategoryInfo:ParserError:(:String)[],ParseException
+ FullyQualifiedErrorId:TerminatorExpectedAtEndOfString
我可以阻止PowerShell解释这一点的一些方法是:
foo.exe "-name=`"john.doe`""
foo.exe '-name="john.doe"'
foo.exe --% -name="john.doe"
$nameArg = "john.doe"; foo.exe -name="$nameArg"
但是,其中一些选项会阻止变量插值。还有其他方法可以阻止PowerShell导致语法问题吗?在这个特定的实例中(添加句点),为什么PowerShell会解释这个问题?
答案 0 :(得分:4)
您在PSv2中看到的是 错误 ;简而言之:启动 <{em> -
的论点如果在.
<<}内还包含"..."
,则会解析解析/ em>的
错误的较小变异 仍然存在于PowerShell v5.1 / PowerShell Core v6.0.1 ;它一直是reported on GitHub。现在,.
内"..."
工作正常,但 未加引号 .
实际上打破了 two 中的参数。< / strong>下面的解决方法对于所述变体也有效 - 请参阅我的this answer。
解决方法是引用整个参数:
# Use '...' instead if you don't need interpolation
foo.exe "-name=john.doe"
请注意,通常 no 需要单独引用值部分 - 即目标程序,<登记/>
-name="john.doe 1"
通常与"-name=john.doe 1"
答案 1 :(得分:0)
我之前遇到过这种情况,我不知道它是否是绕过它的最佳方式,但我以前做过的一种方法是构建执行命令字符串,然后使用{执行它{1}}。
Invoke-Expression
或者,更具体到我的问题,我会有几个参数可以改变我在哈希表中的内容,所以我会将它们添加到命令中。在您的命令的上下文中,我可能有:
$MyCommand = '& foo.exe --% -name="{0}"' -f 'john.doe'
Invoke-Expression $MyCommand
这最终会调用一个读取命令:
$MyArgs = @{
name = 'john.doe'
request = 'delete file'
argument = '\jdoe\temp\nsfwstash.zip'
}
$MyCommand = '& foo.exe --%'
$MyArgs.Keys | ForEach{
$MyCommand = $MyCommand + (' {0}="{1}"' -f $_, $MyArgs[$_])
}
Invoke-Expression $MyCommand