'Author: Denis St-Pierre (Ottawa, Canada) 'Purpose: Ever wanted to run a VBS script from a CMD but do it all from ONE file. ' This converts a VBS file into a CMD Subroutine that recreates ' The VBS code in \%TEMP%\ folder and launches it from inside that CMD. ' The name of the Subroutine matches the name of the VBS file. ' ' DISCLAIMER: Use at your own risk! ' The author and whatever website you got this from is NOT responsible for anything that could go wrong ' ' License: Public Domain 'History: ' 1.0 2Feb2010 Initial release ' 1.1 30May2010 Command line arguments added by Rob van der Woude, to allow use in non-XP Windows versions ' 1.2 7Aug2014 Bug with output file names in non-root folders fixed by Rob van der Woude ' 'Features: Handles symbols that needs to be escaped for CMD's Echo to work ' Output is a fully functional CMD script Option Explicit Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Const TristateUseDefault = -2 Dim arrVBStext Dim blnQuiet Dim intOVRWT, intResult, intValidArgs Dim objDialog, objFile, objFSO, wshShell Dim strBaseFileName, strCMDout, strFileName, strFileNameIN, strFileNameOUT Dim strNewText, strOldText, strText, strVBSline With WScript.Arguments If .Unnamed.Count > 1 Then Syntax intValidArgs = 0 If .Unnamed.Count = 1 Then strFileNameIN = .Unnamed(0) intValidArgs = intValidArgs + 1 End If If .Named.Exists( "Q" ) Then blnQuiet = True intValidArgs = intValidArgs + 1 End If If intValidArgs <> .Count Then Syntax End With Set WshShell = WScript.CreateObject( "WScript.Shell" ) Set objFSO = CreateObject( "Scripting.FileSystemObject" ) If strFileNameIN = "" Then 'File browse dialog box (XP only) (NFG in 7/2008, Thank you MS!) On Error Resume Next Set objDialog = CreateObject( "UserAccounts.CommonDialog" ) If Err Then strFileNameIN = "" WScript.Echo "No file specified." Else objDialog.Filter = "All Files|*.*" objDialog.InitialDir = wshShell.CurrentDirectory intResult = objDialog.ShowOpen If intResult = 0 Then strFileNameIN = "" wshShell.Popup "No file selected.", 1, " ", 64 Else strFileNameIN = objDialog.FileName End If Set objDialog = Nothing End If Set objDialog = Nothing On Error Goto 0 End If If strFileNameIN = "" Then Syntax strFileNameOUT = objFSO.Buildpath( objFSO.GetParentFolderName( strFileNameIN ), objFSO.GetBaseName( strFileNameIN ) & "_CONVERTED.CMD" ) 'Check if strFileNameOUT exists already If objFSO.FileExists( strFileNameOUT ) Then 'does the file EXIST? If blnQuiet Then WScript.Echo "Deleting existing file." objFSO.DeleteFile( strFileNameOUT ) Else intOVRWT = MsgBox( strFileNameOUT & " exists already" & vbCrLf & "Overwrite?", vbYesNoCancel, "Overwrite?" ) If intOVRWT = 6 Then 'proceed objFSO.DeleteFile( strFileNameOUT ) Else wshShell.Popup "Exiting as requested.", 1, " ", 64 WScript.Quit End If End If End If 'open strFileNameANSI file, and put entire file into a variable Set objFile = objFSO.OpenTextFile( strFileNameIN, ForReading ) strText = objFile.ReadAll objFile.Close '************ Start converting ************* '^ Escape character. ' Adding the escape character before a command symbol ' allows it to be treated as ordinary text. 'When piping or redirecting any of these characters you should 'prefix with the escape ^ character: \ & | > < ^ 'e.g. ^\ ^& ^| ^> ^< ^^ '# Escape out ^ symbols (Must be 1st !!!) strOldText = "^" strNewText = "^^" strText = Replace( strText, strOldText, strNewText ) '# Escape out \ symbols 'strOldText = "\" 'strNewText = "^\" 'strText = Replace( strText, strOldText, strNewText ) '# Escape out & symbols strOldText = "&" strNewText = "^&" strText = Replace( strText, strOldText, strNewText ) '# Escape out | symbols strOldText = "|" strNewText = "^|" strText = Replace( strText, strOldText, strNewText ) '# Escape out > symbols strOldText = ">" strNewText = "^>" strText = Replace(strText, strOldText, strNewText) '# Escape out < symbols strOldText = "<" strNewText = "^<" strText = Replace( strText, strOldText, strNewText ) 'Converting into array 'Dim arrVBStext() arrVBStext = Split( strText, vbCrLf ) 'create one-dimensional array strFileName = objFSO.GetFileName( strFileNameIN ) strBaseFileName = objFSO.GetBaseName( strFileNameIN ) strCMDout = "" strCMDout = strCMDout & "@ECHO OFF" & vbCrLf strCMDout = strCMDout & "Call :" & strBaseFileName & vbCrLf strCMDout = strCMDout & vbCrLf strCMDout = strCMDout & vbCrLf strCMDout = strCMDout & "REM Prevent running the " & strFileName & " twice" & vbCrLf strCMDout = strCMDout & "Exit /b 0" & vbCrLf strCMDout = strCMDout & ":" & strBaseFileName & vbCrLf strCMDout = strCMDout & "REM This will create a file called " & strFileName & " in %TEMP%" & vbCrLf strCMDout = strCMDout & "REM" & vbCrLf strCMDout = strCMDout & "REM The following will overwite any pre-existing file called %TEMP%\" & strFileName & vbCrLf strCMDout = strCMDout & "echo.> %TEMP%\" & strFileName & vbCrLf 'Add Echo in front and >> %TEMP%\.VBS at the end of every line For Each strVBSline in arrVBStext If Trim( strVBSline ) = "" Then strCMDout = strCMDout & "echo. >> %TEMP%\" & strFileName & vbCrLf Else strCMDout = strCMDout & "echo " & strVBSline & " >> %TEMP%\" & strFileName & vbCrLf End If Next strCMDout = strCMDout & "Cscript.exe //NoLogo ""%TEMP%\" & strFileName & """" & vbCrLf strCMDout = strCMDout & "Exit /b 0" & vbCrLf 'Converting done 'Write to file Set objFile = objFSO.OpenTextFile( strFileNameOUT, ForAppending, True ) objFile.WriteLine strCMDout objFile.Close If blnQuiet Then WScript.Echo "created " & strFileNameOUT Else wshShell.Popup "created " & strFileNameOUT, 3, "Completed", 64 End If Set objFile = Nothing Set wshShell = Nothing Set objFSO = Nothing Sub Syntax Dim strMsg strMsg = vbCrLf _ & "Usage: VBS2CMD.VBS vbscript_file.vbs [ /Q ]" & vbCrLf & vbCrLf _ & "Where: vbscript_file.vbs is the file to be ""converted""" & vbCrLf _ & " (mandatory in all Windows versions except XP)" & vbCrLf _ & " /Q prevents popup dialogs" WScript.Echo strMsg WScript.Quit 1 End Sub