【问题标题】:Excel VBA - Passing a variable path with spaces to WinSCP command-lineExcel VBA - 将带有空格的变量路径传递给 WinSCP 命令行
【发布时间】:2019-02-22 14:27:36
【问题描述】:

我的一本 Excel 书籍中有这篇文章底部的代码(我第一次编写 vba 代码)。这里的目标是允许用户:

  1. 使用带有临时文件名的 MXLight 软件开始视频编码
  2. 选择当前视频中人物所在的单元格
  3. 停止视频编码,重命名临时文件,将其移动到特定文件夹, 通过WinSCP软件通过FTP上传,标记为绿色,移动一个单元格 下来。

所以在活动期间,您:

  1. 按下按钮 1,即 Sub StartMXL
  2. 然后突出显示您的单元格
  3. 按下按钮 2,即 Sub StopAndProcess

我的问题如下:

1)首先,整个(停止和处理)按钮不起作用,因为上传功能失败,因为我不知道如何让winscp命令使用引用的变量......而不是尝试从字面上使用这个词。检查子上传下的代码,这是我尝试时的日志文件:

1 . 2015-11-12 17:53:18.490 Connected
2 . 2015-11-12 17:53:18.490 Using FTP protocol.
3 . 2015-11-12 17:53:18.490 Doing startup conversation with host.
4 > 2015-11-12 17:53:18.491 PWD
5 < 2015-11-12 17:53:18.520 257 "/" is the current directory
6 . 2015-11-12 17:53:18.520 Getting current directory name.
7 . 2015-11-12 17:53:18.520 Startup conversation with host finished.
8 < 2015-11-12 17:53:18.520 Script: Active session: [1] ftp1934501@ftp.kaltura.com
9 > 2015-11-12 17:53:18.520 Script: put RealFile
10. 2015-11-12 17:53:18.520 Copying 1 files/directories to remote directory "/"
11. 2015-11-12 17:53:18.520   PrTime: Yes; PrRO: No; Rght: rw-r--r--; PrR: No (No); FnCs: N; RIC: 0100; Resume: S (102400); CalcS: No; Mask: 
12. 2015-11-12 17:53:18.520   TM: B; ClAr: No; RemEOF: No; RemBOM: No; CPS: 0; NewerOnly: No; InclM: ; ResumeL: 0
13. 2015-11-12 17:53:18.520   AscM: *.*html; *.htm; *.txt; *.php; *.php3; *.cgi; *.c; *.cpp; *.h; *.pas; *.bas; *.tex; *.pl; *.js; .htaccess; *.xtml; *.css; *.cfg; *.ini; *.sh; *.xml
14* 2015-11-12 17:53:18.520 (EOSError) System Error.  Code: 2.
15* 2015-11-12 17:53:18.520 The system cannot find the file specified

您可以在第 9 行看到它正在尝试逐字上传名为“RealFile”的文件,而不是使用带有文件名和文件夹结构的变量的内容。该变量在代码的其他部分起作用,例如当我重命名和移动它时。

有什么想法吗?

这是整个事情的总代码:

Public Sub StartMXL()
    Dim MXLapp As String
    MXLapp = "C:\1a7j42w\MXLight-2-4-0\MXLight.exe"
    Shell (MXLapp & " record=on"), vbNormalNoFocus
    AppActivate Application.Caption
End Sub
---
Public Sub StopMXL()
    Dim MXLapp As String
    MXLapp = "C:\1a7j42w\MXLight-2-4-0\MXLight.exe"
    Shell (MXLapp & " record=off"), vbNormalNoFocus
    AppActivate Application.Caption
End Sub
---
Sub ChooseRootDir()
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Please choose a folder"
        .AllowMultiSelect = False
        If .Show = -1 Then Sheets("rawdata").Range("I1").Value = .SelectedItems(1)
    End With
End Sub
---
Public Sub RenameAndMove()
    Dim TempFile As String
    Dim RealFile As String

    If Len(Dir(Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value, vbDirectory)) = 0 Then
        MkDir Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value
    End If
        If Len(Dir(Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value, vbDirectory)) = 0 Then
        MkDir Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value
    End If
        If Len(Dir(Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value & "\" & Sheets("rawdata").Range("L1").Value, vbDirectory)) = 0 Then
        MkDir Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value & "\" & Sheets("rawdata").Range("L1").Value
    End If

    TempFile = Sheets("rawdata").Range("I1").Value & "\tempfile\spiderman.TS"
    RealFile = Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value & "\" & Sheets("rawdata").Range("L1").Value & "\" & ActiveCell.Value & ".TS"

    Name TempFile As RealFile
End Sub
---
Public Sub Upload()
    Dim RealFile As String
    Dim TempFile As String

    RealFile = Sheets("rawdata").Range("I1").Value & "\" & Sheets("rawdata").Range("J1").Value & "\" & Sheets("rawdata").Range("K1").Value & "\" & Sheets("rawdata").Range("L1").Value & "\" & ActiveCell.Value & ".TS"
    TempFile = "C:\1a7j42w\MXLight-2-4-0\recordings\tempfile\spiderman.TS"

    Call Shell( _
    "C:\1a7j42w\WinSCP\WinSCP.com /log=C:\1a7j42w\WinSCP\excel.log /command " & _
    """open ftp://ftp1934501:da7Mc4Fr@ftp.kaltura.com/"" " & _
    """put RealFile"" " & _
    """exit""")
End Sub
---
Sub StopAndProcess()
    Call StopMXL
    Call RenameAndMove
    Call Upload
    Selection.Interior.ColorIndex = 4
    ActiveCell.Offset(1, 0).Select
End Sub

【问题讨论】:

  • 对于问题 1,将 """put RealFile"" " 更改为 """put " &amp; RealFile &amp; """ " - 如果要使用变量的值,变量名称必须在双引号之外
  • 这可以将变量放在那里!但是,现在由于文件有空格,它仍然失败,因为它认为每次有空格都是一个新文件。我试图再添加一组引号来解决这个问题,但它也不起作用。对带有空格的文件有任何想法吗?
  • 你不能在一篇文章中提出多个问题。

标签: vba excel ftp winscp


【解决方案1】:

在 WinSCP 脚本中,您需要:

put "path with space"

见Command parameters with spaces。


在 WinSCP 命令行中,您必须将每个命令用双引号括起来,并将命令本身中的所有双引号括起来:

"put ""path with space"""

见WinSCP command-line syntax。


在 VB 中,您需要将字符串括在双引号中,并将字符串本身中的所有双引号加双引号:

"""put """"path with space"""""" "

要将路径替换为变量,请将path with space 替换为" &amp; RealFile &amp; "。

这给了你:

"""put """"" & RealFile & """"""" "

【讨论】:

  • 谢谢!这行得通。对于像我这样的新手来说,所有疯狂的报价都令人困惑。我可以理解大部分代码背后的逻辑,但所有的引号仍然令人困惑。但这很有效,非常感谢你。喜欢你的软件。我还有一个关于返回焦点的问题,我也会发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 2020-01-11
  • 2020-11-02
相关资源
最近更新 更多