使用PowerShell调用cmd.exe命令,例如copy /b

3

我已经看过了 PowerShell 中快速简单的二进制文件连接

我不感兴趣上面的答案,我想知道以下语法的问题所在:

当我调用像 copy /b 这样的 cmd.exe 命令时:

function join-file {
   copy /b $($args[0])+$($args[1]) $($args[2])
}

我遇到了一个错误:Copy-Item : 找不到位置参数

2个回答

4
正如错误提示所示,copy 实际上只是 Copy-Item 的别名,并且它没有一个 /b 参数。您可以调用 cmd 来使用其复制命令。
function join-file {
   cmd /c copy /b $($args[0])+$($args[1]) $($args[2])
}

2
注意:本答案补充了Doug Maurer的有用答案,该答案提供了一个有效的解决方案(适用于没有空格的文件名)。
PowerShell解析未加引号的复合标记(例如$($args[0])+$($args[1]))存在微妙之处(通过复合标记,我指的是直接连接的不同语法结构): $($args[0])+$($args[1])会产生两个参数[1] - 尽管对于特定的命令(cmd.exe的内部copy命令),这并不是一个问题:
- 参数1:$($args[0])的值。 - 参数2:一个逐字逐句地跟随$($args[1])的+。
为避免这个问题,将整个复合标记用"..."括起来,以可预测地将其视为可展开字符串
结论:
  • 为了安全起见,明确使用双引号(“…”)来括住涉及变量引用或子表达式的复合标记

  • 相比之下,在孤立地引用变量甚至方法调用时,不需要引号或包含在$(...)中,子表达式运算符也不需要

应用于您的命令(请参见下面更好的解决方案):

# Note: See better solution below.
function join-file {
   # Note the "..." around the first argument, and the absence of quoting
   # and $(...) around the second.
   cmd /c copy /b "$($args[0])+$($args[1])" $args[2]
}

然而,如果$args [0]或$($ args [1])包含空格,则copy命令会出现故障;因此,更强大的做法是将文件名和+作为单独的参数传递,copy也支持这种方式:
function join-file {
   # Pass the arguments individually, which obviates the need for quoting
   # and $(...) altogether:
   cmd /c copy /b $args[0] + $args[1] $args[2]
}

您可以按照以下步骤验证:$arr='foo', 'bar'; cmd /c echo $($arr[0])+$($arr[1]),输出结果为:foo +bar(注意空格)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接