Search and replace conundrum - VBscript
I have an application where the INI files are "dumb" and always write the path c:\ to a couple of INI files. "vwcmim.ini" and "vwgsmm.ini" in the windows directory.
I want to list drives (like xternal), check them for data directory, and if it's found replace c:\ with <drive:\> in the INI files.
I've got to the point where it does process the files but instead of putting in the drive letter it just erases the old drive letter c: with a null string.
I am wondering what I'm doing wrong, or if anybody's got a better idea for simple file text search/replace. VBscript code follows. It has to run from a command prompt using cscript <scriptname>
' This script finds and replaces the drive C: with the correct drive letter in the ' INI see below (see SubFolder)
' This allows vACBI to run even where the data drive letter is not c:
' Owen Gilmore - owen.gilmore@united.com
' aogilmore@sbcglobal.net
' 7:20 AM 1/10/2005
Option Explicit
Dim WshProcessEnvironment
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshProcessEnvironment = WshShell.Environment("Process")
'Define Object Variables
Dim FSys
Dim xFolder
Dim xFiles
Dim xFile
Dim tFile
Dim wshShell
'On Error Resume Next
Dim strComputer
Dim objWMIService
Dim colItems
Dim objFSO
Dim objShell
Dim strmsg
Dim u_Drv
Dim u_MedPath
Dim objItem
Dim EnvWinDir
' Define Working Variables
Dim SubFolder
Dim FileText
'Get some necessary environment variables
EnvWinDir = WshProcessEnvironment("windir")
'Define Constants
CONST U_File1 = "vwcmim.ini"
CONST U_File2 = "vwgsmm.ini"
Const ForReading = 1
Const ForWriting = 2
Const TristateUseDefault = -2
'On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
u_MedPath = "\United\VWCMI\DATA"
For Each objItem in colItems
strmsg=strmsg&"DeviceID: " & objItem.DeviceID&vbcrlf
If objFSO.FolderExists(objItem.DeviceID & u_MedPath) Then
u_Drv = objItem.DeviceID
End If
SubFolder = EnvWinDir
'Verify that the script runs in console mode
If UCase(Right(WScript.FullName, Len(WScript.FullName)-InStrRev(WScript.FullName,"\"))) <> "CSCRIPT.EXE" Then
Set wshShell = WScript.CreateObject("WScript.Shell")
wshShell.Run "CSCRIPT.EXE " & WScript.ScriptFullName, 1, False
Set wshShell = Nothing
WScript.Quit
End If
'Set Objects
Set FSys = WScript.CreateObject("Scripting.FileSystemObject")
Set xFolder = FSys.GetFolder(SubFolder)
Set xFiles = xFolder.Files
WScript.Echo SubFolder
WScript.Echo "Directive to process " & xFiles.Count & " files."
'Parse Each file and perform replacements
For Each xFile in xFiles
if xFile.Name = u_File1 OR xFile.Name = u_File2 Then
WScript.Echo " --> " & xFile.Name
WScript.Echo " Reading in contents"
WScript.Echo u_Drv
Set tFile = xFile.OpenAsTextStream(ForReading, TristateUseDefault)
FileText = tFile.ReadAll
tFile.Close
WScript.Echo " Performing Replacement" & FileText & " with " & u_Drv
FileText = REPLACE(FileText, "C:", u_Drv)
WScript.Echo " Saving new file"
Set tFile = xFile.OpenAsTextStream(ForWriting, TristateUseDefault)
tFile.Write FileText
tFile.Close
Else
WScript.Echo " --> " & xFile.Name & " NOT APPLICABLE"
' FileText = ""
End If
Next
Next
'Clean Environment and exit
On Error Resume Next
Set tFile = Nothing
Set xFolder = Nothing
Set xFiles = Nothing
Set xFile = Nothing
Set FSys = Nothing
I want to list drives (like xternal), check them for data directory, and if it's found replace c:\ with <drive:\> in the INI files.
I've got to the point where it does process the files but instead of putting in the drive letter it just erases the old drive letter c: with a null string.
I am wondering what I'm doing wrong, or if anybody's got a better idea for simple file text search/replace. VBscript code follows. It has to run from a command prompt using cscript <scriptname>
' This script finds and replaces the drive C: with the correct drive letter in the ' INI see below (see SubFolder)
' This allows vACBI to run even where the data drive letter is not c:
' Owen Gilmore - owen.gilmore@united.com
' aogilmore@sbcglobal.net
' 7:20 AM 1/10/2005
Option Explicit
Dim WshProcessEnvironment
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshProcessEnvironment = WshShell.Environment("Process")
'Define Object Variables
Dim FSys
Dim xFolder
Dim xFiles
Dim xFile
Dim tFile
Dim wshShell
'On Error Resume Next
Dim strComputer
Dim objWMIService
Dim colItems
Dim objFSO
Dim objShell
Dim strmsg
Dim u_Drv
Dim u_MedPath
Dim objItem
Dim EnvWinDir
' Define Working Variables
Dim SubFolder
Dim FileText
'Get some necessary environment variables
EnvWinDir = WshProcessEnvironment("windir")
'Define Constants
CONST U_File1 = "vwcmim.ini"
CONST U_File2 = "vwgsmm.ini"
Const ForReading = 1
Const ForWriting = 2
Const TristateUseDefault = -2
'On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
u_MedPath = "\United\VWCMI\DATA"
For Each objItem in colItems
strmsg=strmsg&"DeviceID: " & objItem.DeviceID&vbcrlf
If objFSO.FolderExists(objItem.DeviceID & u_MedPath) Then
u_Drv = objItem.DeviceID
End If
SubFolder = EnvWinDir
'Verify that the script runs in console mode
If UCase(Right(WScript.FullName, Len(WScript.FullName)-InStrRev(WScript.FullName,"\"))) <> "CSCRIPT.EXE" Then
Set wshShell = WScript.CreateObject("WScript.Shell")
wshShell.Run "CSCRIPT.EXE " & WScript.ScriptFullName, 1, False
Set wshShell = Nothing
WScript.Quit
End If
'Set Objects
Set FSys = WScript.CreateObject("Scripting.FileSystemObject")
Set xFolder = FSys.GetFolder(SubFolder)
Set xFiles = xFolder.Files
WScript.Echo SubFolder
WScript.Echo "Directive to process " & xFiles.Count & " files."
'Parse Each file and perform replacements
For Each xFile in xFiles
if xFile.Name = u_File1 OR xFile.Name = u_File2 Then
WScript.Echo " --> " & xFile.Name
WScript.Echo " Reading in contents"
WScript.Echo u_Drv
Set tFile = xFile.OpenAsTextStream(ForReading, TristateUseDefault)
FileText = tFile.ReadAll
tFile.Close
WScript.Echo " Performing Replacement" & FileText & " with " & u_Drv
FileText = REPLACE(FileText, "C:", u_Drv)
WScript.Echo " Saving new file"
Set tFile = xFile.OpenAsTextStream(ForWriting, TristateUseDefault)
tFile.Write FileText
tFile.Close
Else
WScript.Echo " --> " & xFile.Name & " NOT APPLICABLE"
' FileText = ""
End If
Next
Next
'Clean Environment and exit
On Error Resume Next
Set tFile = Nothing
Set xFolder = Nothing
Set xFiles = Nothing
Set xFile = Nothing
Set FSys = Nothing
0 Comments
[ + ] Show comments
Answers (2)
Please log in to answer
Posted by:
nmi
19 years ago
ORIGINAL: aogilmor
Set tFile = xFile.OpenAsTextStream(ForReading, TristateUseDefault)
FileText = tFile.ReadAll
tFile.Close
WScript.Echo " Performing Replacement" & FileText & " with " & u_Drv
FileText = REPLACE(FileText, "C:", u_Drv)
WScript.Echo " Saving new file"
Set tFile = xFile.OpenAsTextStream(ForWriting, TristateUseDefault)
tFile.Write FileText
tFile.Close
I've found problems with the OpenAsTextStream method in the past, especially when you consider it's reading the whole file into a buffer somewhere (that's undefined).
Personally, I'd use OpenAsTextFile method and read each line in at a time and do a replace on that.
HTH
nmi
Rating comments in this legacy AppDeploy message board thread won't reorder them,
so that the conversation will remain readable.
so that the conversation will remain readable.