这个问题类似于Passing empty arguments to executables using powershell,但我想扩展问题和答案,并理解"为什么"更好,因为它似乎是一个PowerShell陷阱。
如果加载PSCX并运行echoargs
(外部命令,即exe文件),您可以看到跳过空字符串参数:
PS> echoargs word "two words" "" 123
Arg 0 is <word>
Arg 1 is <two words>
Arg 2 is <123>
但是如果你使用&#34; CMD逃脱&#34; (--%
)您可以将其显示为#34;正确&#34;:
PS> echoargs --% word "two words" "" 123
Arg 0 is <word>
Arg 1 is <two words>
Arg 2 is <>
Arg 3 is <123>
类似地,如果编写PowerShell函数,则正确处理空字符串:
PS> Show-Args word "two words" "" 123
Arg 0 is <word>
Arg 1 is <two words>
Arg 2 is <>
Arg 3 is <123>
由于以下原因,这种差异对我来说似乎很重要。上面显示的示例在命令行上使用了一个文字空字符串,所以至少你有一个问题的提示。 但如果使用包含空字符串的变量,则结果完全相同。这意味着必须要么:
`"this`"
或`"$this`"
或`"`"
......或者会发生坏事!
(@ KeithHill指出了上面的第三个解决方法,所以我在那里添加它是为了完整性。它适用于文字或变量,所以,虽然丑陋,可能是三种解决方法中的最佳选择。) < / p>
因此,PowerShell处理函数的参数的方式与外部命令的参数不同 - 显着如此。这是PowerShell行为的不一致吗?如果没有,为什么不呢?
附录
作为参考,这里是上面使用的PowerShell函数体:
function Show-Args()
{
for ($i = 0; $i -lt $args.length; $i++)
{
Write-Host ("Arg {0} is <{1}>" -f $i, $args[$i])
}
}
这是一个与C#相同的echoargs:
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
System.Console.WriteLine("Arg {0} is <{1}>", i, args[i]);
}
}
}
答案 0 :(得分:2)
可以考虑行为&#34;按设计&#34; (根据实施和测试,很难确定),但我认为这个问题没有多少考虑,你提出了很好的观点。
我个人认为你是对的,PowerShell是不一致的。值得考虑改变是一致的,尽管这有可能破坏现有的脚本。