我需要在 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 的问题
我在使用 PowerShell 2.0
的 Windows Server 2008 R2
、使用 Powershell 3.0
的 Windows Server 2012 R2
中运行了相同的脚本,以及带有 PowerShell 5.1
的 Windows Server 2016
和 Windows 10
。 5.1 的版本失败,而其他两个版本可以。截图如下:
最佳答案
我建议将您的参数作为数组传递并展开,以便所有内容都正确连接/传递:
$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) 提供的库。
关于powershell - powershell中带引号的字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55123768/