我有一组我想要运行的命令,并对结果进行一些返回代码检查,所以我认为很容易将它们放入一个数组中执行。
我们以此为例:
C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section system.webServer/webdav/authoring /enabled:true /commit:apphost
现在,当我把它放入没有任何引号的数组中时,会立即将其解释为命令,执行命令并将结果写入数组:
$commands = @()
$commands += C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section system.webServer/webdav/authoring /enabled:true /commit:apphost
当我使用引号将其作为字符串放入数组时,尝试执行它不起作用。
PS> $commands = @()
PS> $commands += "C:\windows\system32\inetsrv\AppCmd.exe set config ""Default Web Site/"" /sectio n:system.webServer/webdav/authoring /enabled:true /commit:apphost"
PS> $commands[0]
C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /enabled:true /commit:apphost
PS> & $commands[0]
The term 'C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /enabled:true /commit:apphost' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:2
+ & <<<< $commands[0]
+ CategoryInfo : ObjectNotFound: (C:\windows\syst.../commit:apphost:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
那么,我如何正确地将此命令放入数组,队列或其他最适合的命令中,以便在时机成熟时执行它?
答案 0 :(得分:3)
当您使用调用操作符&
时,后面的字符串必须只命名要执行的命令 - 而不是任何参数。使用您配置的内容,您可以使用Invoke-Expression,例如:
iex $command[0]
关于Invoke-Expression的一个警告,如果有任何输入来自用户,请小心使用此命令,因为它可用于注入不需要的命令,例如:
Read-Host "Enter commit value"
Enter commit value: apphost; remove-item c:\ -r -force -ea 0 -confirm:0 #
答案 1 :(得分:0)
好吧,我参加派对已经晚了一年,但你也可以这样做:
new-alias -name Monkey -value“$ env:windir \ system32 \ inetsrv \ APPCMD.exe”
答案 2 :(得分:0)
甚至更晚:我认为用户this answer this other answer和Roman Kuzmin通过将可执行文件名存储在变量及其所有参数中来紧密解决此问题。