Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Command line Powershell命令处理(传入变量)_Command Line_Powershell_Parameters_Arguments_Command - Fatal编程技术网

Command line Powershell命令处理(传入变量)

Command line Powershell命令处理(传入变量),command-line,powershell,parameters,arguments,command,Command Line,Powershell,Parameters,Arguments,Command,我正在创建一个Powershell脚本来部署一些代码,部分过程是调用一个名为RAR.EXE的命令行压缩工具来备份一些文件夹 我试图动态构建参数,然后让powershell使用变量调用命令,但我遇到了麻烦。它不起作用了 运行下面的脚本,你就会明白我在说什么。作为变量传入的参数正在被损坏。如果在中传递整个command+参数,则会收到臭名昭著的“未识别为cmdlet…”消息 谢谢你的帮助 echo "this should succeed" & cmd /c echo foo echo "

我正在创建一个Powershell脚本来部署一些代码,部分过程是调用一个名为RAR.EXE的命令行压缩工具来备份一些文件夹

我试图动态构建参数,然后让powershell使用变量调用命令,但我遇到了麻烦。它不起作用了

运行下面的脚本,你就会明白我在说什么。作为变量传入的参数正在被损坏。如果在中传递整个command+参数,则会收到臭名昭著的“未识别为cmdlet…”消息

谢谢你的帮助

echo "this should succeed"
& cmd /c echo foo

echo "why does this echo out an additional double quote?"
$param = "/c echo foo"
& cmd "$param"

echo "this does the same"
$param = "/c echo foo"
& cmd $param

echo "escaping the slash doesn't work either..."
$param = "`/c echo foo"
& cmd $param

echo "this fails, but why?"
$cmd = "cmd /c echo foo"
&$cmd

我认为这是使用cmd/c的产物。运行

$param = "echo foo"
cmd /c $param

很好。除非您有一个真正的代码示例,否则排除故障有点困难。

我以前在尝试调用可执行类型命令时遇到过&call操作符的问题,就像您正在尝试的那样。我不知道为什么。然而,调用表达式似乎总是在这种情况下起作用:

PS C:\> $cmd = "cmd /c echo foo"
PS C:\> Invoke-expression $cmd
foo

上一个示例失败,因为“&”将字符串视为一个参数,因此它正在查找名为“cmd/c echo foo.exe”的程序:)

这项工作:

& $cmd $params
至于双引号问题,cmd似乎不喜欢PowerShell在参数周围加引号。它得到了这样的结果:

cmd "/c echo foo"
因此,我认为它将/c之后的所有内容都视为确切的命令,如下所示:

echo foo"
一些命令行程序和命令行的时髦解析(这就是为什么PowerShell接管了函数和cmdlet的这项工作)。就cmd而言,我建议:

$param = "echo foo"
& cmd /c $param

在这种情况下,不需要呼叫操作员“&”。它用于在新范围内调用命令。这通常用于调用由字符串或脚本块指定的命令。它还有一个附带的好处,即在命令完成且作用域消失后,会丢弃在PowerShell脚本中创建的任何变量

然而,由于cmd是一个EXE,它在一个完全不同的进程中执行。FWIW,您可以直接从cmd.exe获得类似的输出:

> cmd "/c echo foo"
foo"
因此,末尾的额外引号是cmd.exe问题。通常,在PowerShell进行解析以调用命令时,需要将命令与参数分开,例如:

45> & { $foo = "foo" }
46> $foo  # Note that $foo wasn't found - it went away with the scope
47> . { $foo = "foo" } # dotting executes in the current scope
48> $foo 
foo
这里值得注意的例外是调用表达式的行为类似于“计算此字符串”函数。小心使用,尤其是当用户提供字符串时。如果他们提供“RIC:\-r”,你的一天可能会很糟糕

在这种情况下,正如其他人所建议的,我将从字符串$param string中拉出/c并指定它,例如:

cmd /c $param
或者使用Invoke表达式,但要小心使用。顺便说一句,当您试图调试从PowerShell向EXE发送参数时,请查看PowerShell社区扩展()中的echoargs实用程序。它非常方便:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>
49>$param=“/c echo foo”
50>echoargs$param
arg0是

这表明cmd.exe将“/c echo foo”作为单个参数接收。“/c”应该是与“echo foo”(要执行的命令)分开的参数。

我发现的另一种方法是为命令行创建一个参数数组,并将其与apersand&call运算符一起使用。大概是这样的:

$exe = "cmd";
[Array]$params = "/c", "echo", "foo";

& $exe $params;
这对我很有效

我最初在这里发现了这种技术:

当参数包含在字符串中时,它们的处理方式不同:

PS D:\> echo "1 2 3"
1 2 3
PS D:\> echo 1 2 3
1
2
3
为args使用变量时会出现相同的结果:

PS D:\> $param = "1 2 3"
PS D:\> echo $param
1 2 3
解决方案是使用阵列:

PS D:\> $param = @(1,2,3)
PS D:\> echo $param
1
2
3

数组也可以很好地用于构建命令行参数;i、 e.$cmdArgs=@('/c','echo foo');cmd$cmdArgs