带有powershell引号的字符串变量

问题描述 投票:2回答:2

我需要在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 R2PowerShell 2.0Windows Server 2012 R2Powershell 3.0Windows Server 2016Windows 10PowerShell 5.1运行相同的脚本。那些有5.1的人失败了,而另外两个人工作了。屏幕截图如下:

PowerShell 2.0 PowerShell 3.0 PowerShell 5.1

powershell winscp
2个回答
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)提供的库。


1
投票
$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,而不是脚本界面。但我知道你在这种情况下有你的具体原因。

© www.soinside.com 2019 - 2024. All rights reserved.