0

我正在尝试为当前目录中的每个特定文件类型(例如每个 .txt 文件)运行以下命令行:

"C:\Program Files (x86)\some program\someprogram.exe" "file.txt" "file.txt.mod" -someparameter

当我从打开的 Windows 命令提示符(包括所有引号)运行这个确切的命令时,它可以工作。但是当我通过这个 VB 运行它时,它什么都不做/立即关闭。

我究竟做错了什么?我觉得它与引号有关,但我的头无法解决。

Set objFSO = CreateObject("Scripting.FileSystemObject") 
objStartFolder = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName)))
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files

For Each objFile in colFiles 
    strFileName = objFile.Name
    If objFSO.GetExtensionName(strFileName) = "txt" Then
        RunCommand()
    End If
Next

Sub RunCommand
    Set oShell = WScript.CreateObject ("WScript.Shell")
    oShell.run "cmd.exe /C ""C:\Program Files (x86)\some program\someprogram.exe"" """ & objFile.Path & """ """ & objFile.Path & ".mod"" -someparameter"
    Set oShell = Nothing
End Sub
4

1 回答 1

1

你应该

  • 降低故障风险

经过

  1. 使用“选项显式”
  2. 通过使用标准方法 (.GetParentFolderName) 来避免聪明的“自己动手”黑客攻击
  3. 正确使用类型前缀 (objStartFolder)
  4. 避免只使用一次的变量(objFolder、colFiles)
  5. 不使用全局变量将参数传递给 Subs/Functions (objFile)
  6. 避免(不必要的)压力(.Run 无需等待,每个文件的新 WScript.Shell,“cmd”而不是“%comspec%”)
  7. 在“dos 框”中使用 cscript 而不是双击/wscript

  • 检查你的假设

经过

  1. 诊断输出(在调用 RunCommand 之前立即使用 .Echo objFile.Name,使用变量来存储和 .Echo 发送到 .Run 的命令)
  2. 检查提供诊断的函数的返回值 (.Run)
  3. 健全性检查,例如:

(只是为了驯服格式化程序)

>> WScript.Echo goFS.GetExtensionName("A.TXT")
>>
TXT
于 2013-09-15T23:24:49.360 回答