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

Tra*_*vis 142 powershell

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

如何从脚本中执行此命令?

我已经尝试了几种Invoke-Command或Invoke-Expression的组合而没有运气.

这是我构建变量的方式:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"
Run Code Online (Sandbox Code Playgroud)

这是变量在打印到屏幕时的样子:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log
Run Code Online (Sandbox Code Playgroud)

Rom*_*min 188

这是另一种方法,Invoke-Expression但有两个变量(命令:字符串和参数:数组).这对我来说可以.假设 7z.exe在系统路径中.

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

& $cmd $prm
Run Code Online (Sandbox Code Playgroud)

如果命令已知(7z.exe)并且只有参数是可变的,那么这样做

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

& 7z.exe $prm
Run Code Online (Sandbox Code Playgroud)

顺便说Invoke-Expression一下,有一个参数也适用于我,例如这是有效的

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

Invoke-Expression $cmd
Run Code Online (Sandbox Code Playgroud)

PS我通常更喜欢使用参数数组的方式,因为编程方式比构建表达式更容易Invoke-Expression.

  • @RomanKuzmin 它有效!`$path="C:\Windows\System32\inetsrv"; &“$path\appcmd”` (2认同)
  • `invoke-expression` 需要一个字符串,而 `&` 可以有多个 `strings`。 (2认同)

kbr*_*ton 37

尝试使用Invoke-Expression以下命令调用命令:

Invoke-Expression $cmd1
Run Code Online (Sandbox Code Playgroud)

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

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd
Run Code Online (Sandbox Code Playgroud)