Строковая переменная с кавычками в powershell - PullRequest
2 голосов
/ 12 марта 2019

Мне нужно запустить winscp.com с некоторыми параметрами в скрипте powershell. Если я сделаю следующее в консоли, он будет работать как положено.

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 не получается, а у двух других работает. Скриншоты ниже:

PowerShell 2.0 PowerShell 3.0 PowerShell 5.1

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Я предлагаю передавать ваши аргументы в виде массива и сплаттинга, чтобы все соединялось / передавалось правильно:

$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 голос
/ 12 марта 2019
$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 в PowerShell , а незатем сценарий интерфейса.Но я понимаю, что у вас есть конкретные причины в этом случае.

...