gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:37:15 27 4
gpt4 key购买 nike

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

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

运行以下脚本,您应该会看到我在说什么。作为变量传入的参数正在被破坏。如果我传递整个命令 + 参数,我会收到臭名昭著的“未被识别为 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

最佳答案

在这种情况下,不需要调用运算符“&”。它用于在新范围内调用命令。这通常用于调用由字符串或脚本块指定的命令。它还具有附带好处,即在命令完成且作用域消失后,将丢弃在 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

这里值得注意的异常(exception)是 Invoke-Expression 的行为类似于“评估此字符串”函数。请谨慎使用,尤其是在用户提供字符串的情况下。如果他们提供“ri C:\-r”,您的一天可能会很糟糕。

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

或者使用 Invoke-Expression 但要小心使用。顺便说一句,当您尝试调试从 PowerShell 向 EXE 发送参数的问题时,请查看 PowerShell 社区扩展 ( http://pscx.codeplex.com ) 中的 echoargs 实用程序。它非常方便:
49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

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

关于command-line - Powershell 命令处理(传入变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809333/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com