2013-03-20 118 views
0

我认为这已被问了很多次,但我无法找到适合我的答案。从PowerShell运行另一个命令行应用程序

  • 我需要从变量中构建命令行。
  • 我需要运行该命令行可执行文件。
  • 我需要将结果发布到与我的脚本相同的屏幕上。

我试图运行Putty SCP与自定义源和目的地。

我搞砸了&Invoke-Expression但它是不可能的。在PowerShell中,一些简单的#1用例非常难以置信,它们在一切方面都吃得很好。

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

而且我知道这可能会失败,因为输出缓冲区可能会变满,除非您迷上了事件并将其舀出。

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

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

编辑

例如:

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

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

+0

第三种方法是用C#写一个小命令,但尽管我已经在这样做了过去,我想避免加载模块。 – 2013-03-20 13:09:43

+0

“我已经搞乱了&和Invoke-Expression,但它不可能” - 我很确定它不是。发布你的代码并指出什么不起作用,并且有人可以尝试提供帮助。否则,这听起来像一个咆哮。 – alroc 2013-03-20 13:14:39

+0

发布exe名称,您需要的参数以及要插入的变量,并提及它们的位置 – 2013-03-20 13:17:35

回答

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 
+0

我没有看到那个。必须调整心智模式。谢谢Joey。 – 2013-03-20 13:58:26

+0

Powershell需要一个字符串参数数组或行之间的空格,以便可以标记它们。一个包含空格的字符串将被解释为单个标记。 – 2013-03-20 14:08:20