我需要在powershell脚本中使用一些参数运行winscp.com。如果我在控制台中执行以下操作,它将按预期工作。
Set-Alias WINSCP "C:\Program Files (x86)\WinSCP\WinSCP.com"
WINSCP /command "option batch continue" "option confirm off" "option reconnecttime 5" "open username:Password@SFTPServer -privatekey=\\server\share\Private_Key.ppk" "mkdir /folder/subfolder" "exit"
我需要将此命令存储为变量,因为它将根据要求自动生成。所以我做了如下:
Set-Alias WINSCP "C:\Program Files (x86)\WinSCP\WinSCP.com"
$comm = "`"option batch continue`" `"option confirm off`" `"option reconnecttime 5`" `"open username" + ":password@SFTPServer -privatekey=\\server\share\privatekey.ppk`" `"mkdir /folder/subfolder`" `"exit`""
WINSCP /command $comm
但是,这似乎不起作用。某处字符串解析搞砸了。当我运行此脚本时,它将提示输入SFTP服务器名称。它应该从之前提供的命令解析它。输出如下:
PS C:\> Set-Alias WINSCP "C:\Program Files (x86)\WinSCP\WinSCP.com"
PS C:\> $comm = "`"option batch continue`" `"option confirm off`" `"option reconnecttime 5`" `"open username" + ":password@SFTPServer -privatekey=\\server\share\privatekey.ppk`" `"mkdir /folde
r/subfolder`" `"exit`""
PS C:\> WINSCP /command $comm
Opening session using command-line parameter in scripting is deprecated. Use 'open' command instead.
Host:
但是,如果我打印$comm
变量,它似乎是正确的。
"option batch continue" "option confirm off" "option reconnecttime 5" "open username:password@SFTPServer -privatekey=\\server\share\privatekey.ppk" "mkdir /folder/subfolder" "exit"
这有什么不对?
更新:这似乎是PowerShell 5.1的问题我在Windows Server 2008 R2
与PowerShell 2.0
,Windows Server 2012 R2
与Powershell 3.0
,Windows Server 2016
和Windows 10
与PowerShell 5.1
运行相同的脚本。那些有5.1的人失败了,而另外两个人工作了。屏幕截图如下:
我建议将你的参数作为一个数组传递并splatting所以所有东西都加入/传递正确:
$winscp = "${Env:ProgramFiles(x86)}\WinSCP\WinSCP.com"
$winscpArgs = @(
'/command'
'"option batch continue"'
'"option confirm off"'
'"option reconnecttime 5"'
'"open username:password@SFTPServer -privatekey=\\server\share\privatekey.ppk"'
'"mkdir /folder/subfolder"'
'"exit"'
)
& $winScp @winscpArgs
但是,更好的选择是使用WinSCP(TODO)提供的库。
$comm = "`"option batch continue`" `"option confirm off`" `"option reconnecttime 5`" `"open username" + ":password@SFTPServer -privatekey=\\server\share\privatekey.ppk`" `"mkdir /folder/subfolder`" `"exit`""
WINSCP /command $comm
以上将$comm
作为一个参数传递给WinSCP,而不是六个参数。
我认为让PowerShell做你真正想要的事情是非常困难的,同时保持$comm
是一个字符串变量。
但是,如果你将$comm
更改为数组,这很容易:
$comm = "option batch continue", "option confirm off", "option reconnecttime 5", "open username:password@SFTPServer -privatekey=\\server\share\privatekey.ppk", "mkdir /folder/subfolder", "exit"
如果您需要将$comm
保留为字符串以进行配置,请使用您自己的唯一分隔符(我在此处使用管道|
):
$comm = "option batch continue|option confirm off|option reconnecttime 5|open username:password@SFTPServer -privatekey=\\server\share\privatekey.ppk|mkdir /folder/subfolder|exit"
WINSCP /log=log.log /command $comm.split("|")
一般来说,最好使用WinSCP .NET assembly in PowerShell,而不是脚本界面。但我知道你在这种情况下有你的具体原因。