无法在VBScript中找到文件

时间:2017-04-01 18:39:57

标签: vbscript

VBE编码器部分工作(从以前的经验,但这次它找不到所需的文件。该文件在%temp%文件夹中,所以路径中有空格,但我使用了" "可以在代码中看到。MsgBox显示正确的文件,我可以确认它的存在,但代码在fso.GetFile时失败。

这是使用目标文件(完整路径)作为参数调用的较大脚本的一部分。目标文件先前由调用脚本创建。

主脚本(使用目标文件调用):

Set fso      = CreateObject("Scripting.FileSystemObject")
Set wshShell = WScript.CreateObject("WScript.Shell")
textFile     = WScript.Arguments(0)
GetExtension = fso.GetExtensionName(fso.GetFileName(textFile))

If LCase(GetExtension) = "vbs" Then
    Set oFilesToEncode = WScript.Arguments
    Set oEncoder = CreateObject("Scripting.Encoder")
    For i = 0 To oFilesToEncode.Count - 1
        file = """" & Trim(oFilesToEncode(i)) & """"
        MsgBox file

        If fso.FileExists(Left(file, Len(file) - 3) & "vbe") Then fso.DeleteFile(Left(file, Len(file) - 3) & "vbe")

        Set oFile   = fso.GetFile(file)
        Set oStream = oFile.OpenAsTextStream(1)
        sSourceFile = oStream.ReadAll
        oStream.Close

        sDest        = oEncoder.EncodeScriptFile(".vbs", sSourceFile, 0, "")
        sFileOut     = Left(file, Len(file) - 3) & "vbe"
        Set oEncFile = fso.CreateTextFile(sFileOut)
        oEncFile.Write sDest
        oEncFile.Close
    Next
End If

WScript.Quit

调用脚本部分:

Do While fso.FileExists(strTempVBS) = False
Loop

strKey  = "HKEY_CLASSES_ROOT\Engineers-Toolbox\Multi-Tool\Installed\Path\"
value    = wshShell.RegRead( strKey )
arg     = " " & strTempVBS
running = "C:\Custom\Multi-Tool\Multi-Tool.exe " & """" & arg & """"
wshShell.Run running, True

我已经尝试过使用硬编码路径到exe来实现它,'值'包含主脚本的路径。

2 个答案:

答案 0 :(得分:2)

不要过早地在路径周围添加引号。我总是困惑为什么人们继续这样做,因为它产生的问题多于解决的问题。在实际需要时添加双引号,但不是之前。

FileSystemObject方法可以处理带空格的路径,而无需额外的双引号。实际上,他们会将路径字符串中的双引号解释为路径的一部分并抛出错误,因为它们无法找到名称中带有双引号的文件(无论如何都会invalid

检查文件是否存在也不起作用,因为您没有考虑添加到路径字符串中的引号:

file = """C:\some\folder\file.vbs"""
WScript.Echo file
WScript.Echo Left(file, Len(file) - 3) & "vbe"

上面代码段的输出是

"C:\some\folder\file.vbs"
"C:\some\folder\file.vvbe

改变这个:

file = """" & Trim(oFilesToEncode(i)) & """"

进入这个:

file = Trim(oFilesToEncode(i))

问题就会消失。

答案 1 :(得分:0)

好的,解决方法是(可预测地)在调用脚本中添加引号,这样VBS到VBE编码器部分就可以保持标准。

strTEMP         = wshShell.ExpandEnvironmentStrings( "%UserProfile%" ) & "\AppData\Local\Multi-Tool\"
strTempVBS      = strTEMP & "observe.vbs"
strKey          = "HKEY_CLASSES_ROOT\Engineers-Toolbox\Multi-Tool\Installed\Path\"
value           = wshShell.RegRead( strKey ) & " "
running         = value & "" & chr(34) & strTempVBS & chr(34) & ""
wshShell.Run    running ,True

有趣的是如何添加报价。这使得被调用脚本甚至可以找到包含空格的完整路径所需的文件。