2017-04-01 87 views
-1

VBEエンコーダセクションが動作します(以前の経験からこのファイルでは必要なファイルが見つかりませんでした)。ファイルは%temp%フォルダにありますので、パスに空白がありますが、 MsgBoxには正しいファイルが表示されていますが、その存在を確認できますが、コードは失敗します。fso.GetFileVBScriptでファイルを見つけることができません

これは、ターゲットファイル(フルパス)で呼び出される大きなスクリプトの一部ですターゲットファイルは呼び出し元のスクリプトによってあらかじめ作成されています

メインスクリプト(対象ファイルで呼び出されます):

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 

スクリプトを呼び出すのセクション:私はそれが軌道に乗るためにexeファイルへのパスをハードコーディング使用して試してみました

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

[OK]を解決策は、(予期して)呼び出し元のスクリプトで引用符を追加することです。つまり、VBEエンコーダセクションへのVBSは標準のままです。

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 

興味深いのは、引用符の追加方法です。これにより、呼び出されたスクリプトは、完全なパスにスペースが含まれていても必要なファイルを見つけました。

関連する問題