WinSCP "lcd .\" 命令在 VBA 中执行时在 C:\WINDOWS\system32 中结束,而不是像手动执行时那样的用户配置文件文件夹

WinSCP "lcd .\" command ends up in C:\WINDOWS\system32 when executed in VBA, instead of user profile folder like when executed manually

尝试通过从 Excel VBA 调用批处理文件从 SFTP 服务器下载简单的文件。这是蝙蝠:

@echo off

".\WinSCP.com" ^
/log="C:\Users\User\Documents\WinSCP.log" /ini=nul ^
 /command ^
    "open sftp://user:password@site.com/ -hostkey=""ssh-rsa 4096 y+key=""" ^
    "cd /" ^
    "lcd .\" ^
    "get file.TXT" ^
    "exit"

exit 

脚本 运行 如果我手动 运行 bat 是完美的,但如果从 VBA 调用它则不会执行。

我试过:

Set oSHELL = VBA.CreateObject("WScript.shell")
exitCode = oSHELL.Run("""C:\Users\" & Environ("username") & "\Folder\Folder Name Has Spaces\sftp.bat""", 0, True)
If exitCode <> 0 Then
  MsgBox "Failed to download TN1!", vbCritical, "Failure"
Else
  MsgBox "Downloaded successfully", vbOKOnly, "Success"
End If

而且,简单地说:

Call Shell("""C:\Users\" & Environ("username") & "\Folder\Folder Name Has Spaces\sftp.bat""", 0, True)

编辑:我将它指向 program files (x86) winscp.com 文件,它生成了一个日志。 lcd .\ 指向受限文件夹 (system32):

> 2021-05-21 10:54:10.918 Script: lcd .\
< 2021-05-21 10:54:10.918 Script: C:\WINDOWS\system32

如何解决这个问题?我不能使用绝对文件路径,因为根据用户名不同,它会有所不同。

lcd .\什么都不做!如果批处理文件有效,当您手动 运行 它时,这只是因为批处理文件从一开始就在正确的工作目录中启动,而不是因为 lcd .\.

如果您想在当前用户配置文件文件夹的 syncfolder 子文件夹中工作,无论从何处执行批处理文件,请使用:

    "lcd ""%USERPROFILE%\syncfolder""" ^