我下载了用于合并junit报告的npm软件包-https://www.npmjs.com/package/junit-merge。
问题是我有多个文件要合并,并且我试图使用字符串变量来保存要合并的文件名。
当我像这样编写脚本myslef时:
junit-merge a.xml b.xml c.xml
这有效,正在创建合并文件,但是当我这样做时
$command = "a.xml b.xml c.xml"
junit-merge $command
这不起作用。错误是
错误:找不到文件
有人遇到过类似的问题吗?
$command = "a.xml b.xml c.xml"; junit-merge $command
在命令行junit-merge "a.xml b.xml c.xml"
[1]]中产生的结果,即,它将字符串a.xml b.xml c.xml
作为单个参数传递给junit-merge
,这不是故意的。 在这方面,
PowerShell会像bash
一样像POSIX之类的shell一样:bash
中,由于引用了[[unquoted
$command
的值将为-受到word splitting(所谓的shell expansions中的一个)的约束,确实会导致3个不同的参数(尽管最好是基于数组的调用)。PowerShell不支持类似bash
的外壳扩展[2];它具有不同的,通常更灵活的结构,例如下面讨论的溅射技术。相反,将您的参数定义为单独的数组的元素
,如justnotme建议:# Define the *array* of *individual* arguments.
$command = "a.xml", "b.xml", "c.xml"
# Pass the array to junit-merge, which causes PowerShell
# to pass its elements as *individual arguments*; it is the equivalent of:
# junit-merge a.xml b.xml c.xml
junit-merge $command
这是一种称为splatting]的PowerShell技术的应用程序,在其中您指定要通过,如您的情况):variable
传递给命令的参数。两者之一(通常只用于
- external program
作为参数的[[[[[[array]
,分别作为作为hashtable
用$
替换变量引用中的@
标记
@command
;例如,以下等效于调用Get-ChildItem C:\ -Directory
:$paramVals = @{ LiteralPath = 'C:\'; Directory = $true }; Get-ChildItem @paramVals
由于this GitHub issue中详细描述的错误,
empty参数传递给外部程序(从Windows PowerShell 5.1 / PowerShell [Core] 7.0开始仍然适用)为了保持向后兼容)。例如,foo.exe ""
意外导致仅调用foo.exe
。
此问题同样会影响基于数组的展开,因此$cmdArgs = "", "other"; foo.exe $cmdArgs
产生foo.exe other
,而不是预期的foo.exe "" other
。
@
与基于数组的拼写的可选使用
您也可以将@
标记与
junit-merge @command
尽管在实践中这几乎无关紧要,更安全的选择是使用$
literal的
--%
数组元素的误解。仅@
语法将数组元素--%
识别为特殊的stop-parsing symbol, --%
[该符号告诉PowerShell不要像往常一样解析其余参数,而是按原样传递它们-未扩展,除了扩展--%
样式的变量引用,例如cmd.exe
。
%USERNAME%
编写的命令行的上下文中,而不必考虑PowerShell的语法差异。 >但是,在splatting
中,由cmd.exe
引起的行为是不明显的,最好避免:直接传递参数时, 删除--%
已从结果命令行中
--%
放置的单个数组元素foo bar
被放置为"foo bar"
,即有效地被放置为2] >参数。
[[1]您的电话暗示打算将变量foo bar
的值作为单个参数
$command
括起来。确保a.xml b.xml c.xml
中包含的字符串。请注意,这些双引号与您最初为$command
分配值的方式无关。不幸的是,对于带有嵌入式$command
字符的值,此自动报价无效。 -例如,请参见"
。does
执行一种外壳扩展,但仅在类似Unix的平台(macOS,Linux)上:不带引号的通配符模式,例如this answer确实在您调用外部程序(例如*.txt
)时扩展为它们匹配的文件名,PowerShell调用native globlob。