2017-04-01 91 views
-1

VBE編碼器部分工作(從以前的經驗,但這次它無法找到所需的文件。該文件位於%temp%文件夾,所以有路徑中的空間,但我已經使用了「」如可以在代碼中可以看出,該MsgBox顯示了正確的文件,我可以證實它的存在,但代碼失敗時fso.GetFile無法在VBScript中找到文件

這是一個被稱爲與目標文件(完整路徑)大的腳本的一部分目標文件先前由調用腳本創建。

主腳本(用目標文件調用):

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 

我已經使用硬編碼的路徑,文件就可以得到它去,「價值」試圖包含路徑到主腳本。

+0

您是否有錯誤代碼?你能給完整的文件路徑(包括擴展名)嗎? – Alexander

+0

'錯誤代碼800a0035文件未找到'完整路徑是「C:\ Users \ John Doe \ AppData \ Local \ Multi-Tool \ observe.vbs」 – BertB

回答

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)) 

問題就會消失。

+0

感謝您的回答。事實上,我加了雙引號,看看它是否是間距問題,如前所述,這是衆所周知的好工作區*。它是僅當參數擴展名爲vbs時才調用的腳本的子部分。從vbs到vbe的變化是已知的良好工作。所以錯誤仍然存​​在,因爲雙引號實際上只是一個測試。 – BertB

+0

@BertB如果引號出現在您的實際代碼中,則無法執行此操作。如果他們不是,你爲什麼首先把它們放在你的問題中?請使用[mcve],樣本輸入以及該代碼和輸入生成的實際完整錯誤消息更新您的問題。 –

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 

有趣的是如何加引號。這使得被調用的腳本即使在包含完整路徑的空間中也能找到所需的文件。