我正在尝试在 Powershell 脚本中自动执行一些 WinSCP sFTP 传输,同时仍将大量相关数据存储在变量中。
$outFileName = Split-Path $outFile -Leaf
$outFilePath = Split-Path $outFile -Parent
& $winScpComPath `
/log=$winScpLog /ini=nul `
/command `
"open $sftpUrl -hostkey=$sftpHostKey" `
"lcd $outFilePath" `
"cd $sftpTargetPath" `
"put $outFileName" `
"exit"
如果outFilePath
路径没有空格 (C:\Scripts),则此方法可以完美运行,但如果路径包含空格 ("C:\Program Files"),则此方法会失败,大概是因为它现在用双引号引起来。
错误是Too many parameters for command 'lcd'.
我怀疑它将额外的双引号视为两个变量,从而分割了路径。
粗略的研究表明,许多其他人都对 WinSCP 脚本命令存在问题,要么没有足够多的双引号,要么有太多的双引号,但是,我发现没有人试图在这样的变量中执行此操作,并且需要它适应空间 -包含路径。
任何帮助将不胜感激!如果需要,我还可以附加 WinSCP 日志文件,但它只显示与控制台中相同的错误。
到目前为止,我已经尝试过:
转义路径的空格和引号,如下所示:
$outFilePath -replace ' ', '` '
$outFilePath -replace '"', '`"'
# or this one
$outFilePath -replace ' ', '\ '
$outFilePath -replace '"', '\"'
这些都不起作用,说实话,我不知道是否应该使用 Powershell 的转义字符或 WinSCP/puTTY 的转义字符。
您必须将带有空格的 WinSCP 命令参数用双引号括起来。在 PowerShell 中,这些需要用反引号进一步转义。
所有记录都在这里:
https://winscp.net/eng/docs/commandline#syntax
所以这应该做:
另请注意PowerShell 7.3.0 破坏命令调用。
WinSCP GUI 甚至可以为您生成 PowerShell 脚本模板,并包含所有引用和转义: https://winscp.net/eng/docs/ui_generateurl
虽然一般来说,为了从 PowerShell 使用,最好使用 WinSCP .NET 程序集:
https://winscp.net/eng/docs/library_powershell