Powershell Putty 连接和自动化任务

Powershell Putty Connection and Automating Tasks

我想使用 PowerShell 连接到 PuTTY "saved session",然后指定一个包含一些批处理命令的文件。使用 CMD 这看起来像

d:\putty\psftp 'Saved Session Name' -b d:\location.txt.

我认为 PS 等价物应该看起来像

Start-Process d:\putty\psftp.exe 'Saved Session Name' 
(and then a call to pass a 'get' script) i.e. cd Outgoing get <date>.txt 

但是,我收到以下错误:

a positional parameter cannot be found that accepts the argument

如何使用 PowerShell 完成此操作?

您不一定需要 Start-Process。

当您尝试从 Powershell 运行 d:\putty\psftp.exe 'Saved Session Name' -b d:\location.txt 时会发生什么?我做的第一件事就是像从命令行 运行 一样尝试它。

最大的问题是路径名中是否有空格。您可能需要使用引号和调用运算符(& 符号):&"d:\putty\psftp.exe" 'Saved Session Name' -b "d:\location.txt".

如果确实需要使用 Start-Process,可以这样做:

Start-Process -FilePath "d:\putty\psftp.exe" `
    -ArgumentList "'Saved Session Name' -b d:\location.txt" -Wait

或者像这样:

Start-Process -FilePath "d:\putty\psftp.exe" `
    -ArgumentList 'Saved Session Name', '-b', "d:\location.txt" -Wait

请注意,第一个参数列表是单个字符串,其中包含每个参数,而第二个参数列表是一个字符串数组,每个参数都有一个字符串。一切都需要按照它们在命令行上的顺序进行,而且有点不稳定的情况并不少见。通常一种方法或另一种方法效果更好,但这取决于您调用的应用程序。通常在路径名中使用引号和空格,因为根据您调用的程序,您要经历多个级别的转义(注意到主题了吗?)。

我在上面的代码中添加了 -Wait 参数,因为默认情况下,Start-Process 会继续到下一行而无需等待,因为它实际上会生成一个单独的进程。 -Wait 强制 Powershell 等待,这正是人们在非交互式脚本中通常想要的。

有关呼叫接线员帮助的更多主题,请参阅 Get-Help about_OperatorsGet-Help "call operator"。有关这方面的帮助,请参阅 Get-Help Start-Process

试试这个:

$Path = "d:\putty\psftp.exe" 
$Prm1 = 'Saved Session Name'
$Prm2 = "-b"
$Prm3 = "d:\location.txt"

&$Path $Prm1 $Prm2 $Prm3

添加以下 Technet Wiki link,其中包含在 PowerShell 中 运行 可执行文件的各种方法。

PowerShell: Running Executables

你只需要 plink:

plink 'Saved Session Name'