从PowerShell执行存储在变量中的命令


152

我有一个已构建并存储在PowerShell中的变量中的命令。如果执行写主机并将其复制并粘贴到标准cmd.exe窗口中,则此命令有效。

如何从脚本内部执行此命令?

我尝试了好几次Invoke-Command或Invoke-Expression的组合。

这就是我构建变量的方式:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

这是变量显示在屏幕上的样子:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

Answers:


206

这是没有Invoke-Expression但有两个变量(command:string和parameters:array)的另一种方法。这对我来说可以。假设 7z.exe在系统路径中。

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

如果命令是已知的(7z.exe),并且只有参数是变量,则可以

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

顺便说一句,Invoke-Expression一个参数对我也有效,例如,这有效

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

PS我通常更喜欢使用参数数组的方式,因为它可以通过程序编写而不是为构造表达式Invoke-Expression


太棒了。现在开始融合在一起。代替'c:\ temp \ with space \ test1.zip',我可以只使用$ variable吗?我需要将其放置为“”还是“”?
特拉维斯

泼洒似乎工作一样:$ CMD @prm但我很好奇这是为什么
C2H5OH

44

尝试使用调用命令Invoke-Expression

Invoke-Expression $cmd1

这是我的机器上的工作示例:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iex是的别名Invoke-Expression因此您可以执行以下操作:

iex $cmd1

有关完整列表:请访问https://ss64.com/ps/了解更多信息Powershell

祝好运...


告诉我术语'7z.exe a -tzip c:\ arc_logs \ site-host-at-web1-100827.zip c:\ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log'不被识别为cmdlet,函数,脚本文件或可操作程序。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在:line:14 char:1 +&<<<< $ cmd1
特拉维斯

@Travis:糟糕。如果没有参数,则&符起作用。我为您的命令更新了解决方案。
kbrimington

我之前尝试过invoke-expression,但没有成功。它吐出错误:错误的数字常量:7.在:line:1 char:2 + 7z <<<< .exe a -tzip c:\ arc_logs \ site-host-at-web1-100827.zip c:\ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log几乎好像它正在尝试评估它而不是执行它。
特拉维斯

@Travis:可能是您的路径中没有7z.exe。验证它是否在路径上,和/或尝试在表达式中为可执行文件提供完整的路径名。
kbrimington

1
@Travis:我只是在我自己的系统上确认7z.exe出现了您描述的错误,只是在命令提示符下键入,但是具有7z.exe的完整路径(对我来说'C:\Program Files\7-zip\7z.exe',我可以执行7z.exe。
kbrimington
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.