如何从字符串执行任意本机命令?

18 浏览
0 Comments

如何从字符串执行任意本机命令?

我可以用以下场景来表达我的需求:编写一个函数,接受一个字符串作为本机命令运行。

这并不是一个过分的想法:如果您从公司的其他命令行工具接口中获得要运行的命令,因为您无法控制命令,您需要接受任何有效的命令作为输入。这些是我一直无法轻松克服的主要问题:

  1. 命令可能执行一个路径中带有空格的程序:

    $command = '"C:\Program Files\TheProg\Runit.exe" Hello';
    

  2. 命令可能具有含有空格的参数:

    $command = 'echo "hello world!"';
    

  3. 命令可能同时具有单引号和双引号:

    $command = "echo `"it`'s`"";
    

是否有任何干净的方法来完成这个?我只能想出华丽而丑陋的解决方法,但对于一种脚本语言,我觉得这应该是非常简单的。

admin 更改状态以发布 2023年5月21日
0
0 Comments

请参阅这个微软连接报告,了解使用PowerShell运行shell命令是多么困难(讽刺啊)。

http://connect.microsoft.com/PowerShell/feedback/details/376207/

他们建议使用--%作为一种强制PowerShell停止尝试解释右侧文本的方法。

例如:

MSBuild /t:Publish --% /p:TargetDatabaseName="MyDatabase";TargetConnectionString="Data Source=.\;Integrated Security=True" /p:SqlPublishProfilePath="Deploy.publish.xml" Database.sqlproj

0
0 Comments

Invoke-Expression,也可以使用别名iex。以下内容适用于您的例子2和3:

iex $command

有些字符串无法直接运行,例如例子1因为exe在引号内。如果按照如下方式,就可以直接运行,因为字符串的内容正好可以直接从PowerShell命令提示符运行:

$command = 'C:\somepath\someexe.exe somearg'
iex $command

但是,如果exe在引号内,就需要通过&帮助来运行,就像这个例子中,在命令行上运行的一样:

>> &"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"

然后在脚本中:

$command = '"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"'
iex "& $command"

通常情况下,您可以通过检测命令字符串的第一个字符是否为"来处理几乎所有情况,如此幼稚的实现:

function myeval($command) {
    if ($command[0] -eq '"') { iex "& $command" }
    else { iex $command }
}

但您可能会发现一些需要以不同方式调用的其他情况。在这种情况下,您需要使用try{}catch{},也许是针对特定异常类型/消息,或检查命令字符串。

如果您始终收到的是绝对路径而不是相对路径,那么您不应该有除上述2种情况之外的很多特殊情况。

0