Excel VBA - 将带空格的变量路径传递给 WinSCP 命令行
Excel VBA - Passing a variable path with spaces to WinSCP command-line
我的 excel 一本书中的 post 底部有代码(我第一次写 vba 代码)。这里的目标是让用户:
- 使用带有临时文件名的 MXLight 软件开始视频编码
- select 一个包含当前正在视频中的人的单元格
- 停止视频编码,重命名临时文件,将其移动到特定文件夹,
通过WinSCP软件通过FTP上传,标记为绿色,移动一个格子
下来。
所以在活动期间,您:
- 按下按钮 1,这是 Sub StartMXL
- 然后突出显示您的单元格
- 按下按钮 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:a7j42w\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:a7j42w\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:a7j42w\MXLight-2-4-0\recordings\tempfile\spiderman.TS"
Call Shell( _
"C:a7j42w\WinSCP\WinSCP.com /log=C:a7j42w\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
在 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
替换为 " & RealFile & "
。
这给你:
"""put """"" & RealFile & """"""" "
我的 excel 一本书中的 post 底部有代码(我第一次写 vba 代码)。这里的目标是让用户:
- 使用带有临时文件名的 MXLight 软件开始视频编码
- select 一个包含当前正在视频中的人的单元格
- 停止视频编码,重命名临时文件,将其移动到特定文件夹, 通过WinSCP软件通过FTP上传,标记为绿色,移动一个格子 下来。
所以在活动期间,您:
- 按下按钮 1,这是 Sub StartMXL
- 然后突出显示您的单元格
- 按下按钮 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:a7j42w\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:a7j42w\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:a7j42w\MXLight-2-4-0\recordings\tempfile\spiderman.TS"
Call Shell( _
"C:a7j42w\WinSCP\WinSCP.com /log=C:a7j42w\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
在 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
替换为 " & RealFile & "
。
这给你:
"""put """"" & RealFile & """"""" "