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来实现它,'值'包含主脚本的路径。
答案 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
有趣的是如何添加报价。这使得被调用脚本甚至可以找到包含空格的完整路径所需的文件。