从PowerShell运行另一个命令行应用程序

时间:2013-03-20 13:08:23

标签: powershell powershell-v2.0

我认为这已被多次询问但我找不到适合我的答案。

  • 我需要从变量构造一个命令行。
  • 我需要运行该命令行可执行文件。
  • 我需要将结果显示在与我的脚本相同的屏幕上。

我正在尝试使用自定义源和目的地运行Putty SCP。

我与&Invoke-Expression混淆了,但这是不可能的。 PowerShell中的一些简单的#1用例事物是如此令人难以置信的困难,他们吃掉了所有关于它的好东西。

我能看到这样做的唯一方法是在新的Process实例中运行它并设置所有输出重定向,然后在完成后在PS屏幕上将其管道输出。

而且我知道这可能会失败,因为输出缓冲区可能会变满,除非你已经挂钩事件并将其挖出来。

另一种方法是将我的命令行写入批处理文件并运行它。

任何帮助表示赞赏。必须有一个更简单的方法。

修改

例如:

[string]$scpPath = Find-PathToPuttyScpExecutable;
[string]$scpArguments = "-v -r -pw " + $MarkLogicServerPassword + " " + $MarkLogicSourcePath + " " + $MarkLogicServerUserName + "@" + $ServerName + ":" + $MarkLogicDestinationRootPath

我需要执行$scpPath + " " + $scpArguments

1 个答案:

答案 0 :(得分:4)

不要如此依附于字符串。只需运行带参数的命令:

[string]$scpPath = Find-PathToPuttyScpExecutable;
&$scpPath -v -r -pw $MarkLogicServerPassword $MarkLogicSourcePath "$($MarkLogicServerUserName)@$($ServerName):$($MarkLogicDestinationRootPath)"

PowerShell会为您处理报价。在大多数情况下它运作良好,我怀疑你会在这里遇到边缘情况。

如果你必须动态创建参数列表,那么你应该使用一个数组并传递:

$scpArguments = '-v',
                '-r',
                '-pw',
                $MarkLogicServerPassword,
                $MarkLogicSourcePath,
                "$($MarkLogicServerUserName)@$($ServerName):$($MarkLogicDestinationRootPath)"

&$scpPath @scpArguments