Suchen - Ersetzen in einer Textdatei - Beschleunigung möglich?
Hi,
ich möchte durch eine .bat Datei eine .xml Datei parsen um Ersetzungen vorzunehmen.
Ein Beispiel:
Die zugehörige Task [Generalized].xml Datei sieht jetzt noch so aus:
Das Suchen + Ersetzen funktioniert einwandfrei, aber der ganze Vorgang dauert etwa 45 Sekunden (und hier steht kein i386er, sondern ein i5...)
Natürlich könnte ich auch externe Tools verwenden, die das Ganze im Bruchteil einer Sekunde machen (nach wie vor aus der Batch heraus), aber ich würde gern bei dem jetzigen System bleiben, sofern es sich beschleunigen ließe...
Hat jemand eine Idee, wie man das bewerkstelligen könnte?
ich möchte durch eine .bat Datei eine .xml Datei parsen um Ersetzungen vorzunehmen.
Ein Beispiel:
@ECHO OFF & COLOR 0F & CLS
@ECHO Batch: %~0 & ECHO.
SETLOCAL EnableDelayedExpansion
REM ########################################################
REM ### Declare Variables ##################################
REM ########################################################
REM ### Store Directory Paths ##############################
CD /D %~dp0
SET WorkingDir=%CD%
PUSHD..
SET ParentDir=%CD%
POPD
REM ### End Variables ######################################
SET "vSchtasks=%windir%\System32\schtasks.exe"
SET "taskName=Listary"
SET "folderName=Listary_x64"
SET "appName=Listary.exe"
SET "xmlFile=Task.xml"
SET "xmlFileGeneralized=Task [Generalized].xml"
REM ### Admin Check ########################################
REG QUERY "HKU\S-1-5-19" >NUL 2>NUL
IF %ERRORLEVEL% NEQ 0 COLOR 4F
REM Substitute _COMPUTERNAME_ and _CURRENTUSER_ with the current values
DEL /F "%WorkingDir%\%xmlFile%" >NUL 2>NUL
FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO CALL :REPLACE "%%F"
:REPLACE
SET INPUT=%*
SET OUTPUT=!INPUT:_CURRENTUSER_=%USERNAME%!
SET OUTPUT=!OUTPUT:_COMPUTERNAME_=%COMPUTERNAME%!
SET OUTPUT=!OUTPUT:_FOLDERNAME_=%folderName%!
SET OUTPUT=!OUTPUT:_APPNAME_=%appName%!
FOR /F "tokens=* delims=" %%G in ('ECHO %OUTPUT%') DO ECHO %%~G>>"%WorkingDir%\%xmlFile%"
Die zugehörige Task [Generalized].xml Datei sieht jetzt noch so aus:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2012-08-25T21:36:48.0193137</Date>
<Author>_COMPUTERNAME_\_CURRENTUSER_</Author>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<Enabled>true</Enabled>
<UserId>_COMPUTERNAME_\_CURRENTUSER_</UserId>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>_COMPUTERNAME_\_CURRENTUSER_</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"D:\Users\%USERNAME%\Tools\_FOLDERNAME_\_APPNAME_"</Command>
</Exec>
</Actions>
</Task>
Das Suchen + Ersetzen funktioniert einwandfrei, aber der ganze Vorgang dauert etwa 45 Sekunden (und hier steht kein i386er, sondern ein i5...)
Natürlich könnte ich auch externe Tools verwenden, die das Ganze im Bruchteil einer Sekunde machen (nach wie vor aus der Batch heraus), aber ich würde gern bei dem jetzigen System bleiben, sofern es sich beschleunigen ließe...
Hat jemand eine Idee, wie man das bewerkstelligen könnte?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 225326
Url: https://administrator.de/contentid/225326
Ausgedruckt am: 16.11.2024 um 05:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo Highend01,
ansonsten nehm ein einfaches VB-Script:
Grüße Uwe
Zitat von @Highend01:
Das Suchen + Ersetzen funktioniert einwandfrei, aber der ganze Vorgang dauert etwa 45 Sekunden (und hier steht kein i386er, sondern ein i5...)
also hier ist das Script in unter einer Sekunde fertig (älterer Core2Duo mit 2GHz). Da muss irgendwas bei Dir nicht stimmen.Das Suchen + Ersetzen funktioniert einwandfrei, aber der ganze Vorgang dauert etwa 45 Sekunden (und hier steht kein i386er, sondern ein i5...)
Natürlich könnte ich auch externe Tools verwenden, die das Ganze im Bruchteil einer Sekunde machen (nach wie vor aus der Batch heraus), aber ich würde gern bei dem jetzigen System bleiben, sofern es sich beschleunigen ließe...Hat jemand eine Idee, wie man das bewerkstelligen könnte?
probiers mal so (alles ab Zeile 28 deines Scripts durch das hier ersetzen)FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO @(
SET INPUT=%%F
SET OUTPUT=!INPUT:_CURRENTUSER_=%USERNAME%!
SET OUTPUT=!OUTPUT:_COMPUTERNAME_=%COMPUTERNAME%!
SET OUTPUT=!OUTPUT:_FOLDERNAME_=%folderName%!
SET OUTPUT=!OUTPUT:_APPNAME_=%appName%!
SET OUTPUT=!OUTPUT:%%USERNAME%%=%username%!
echo !OUTPUT!>>"%WorkingDir%\%xmlFile%"
)
'----------- Variables --------
FILEIN = "C:\Temp\file.xml"
FILEOUT = "C:\Temp\file_out.xml"
'-------------------------------
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set objShell = CreateObject("Wscript.Shell")
username = objShell.ExpandEnvironmentStrings("%username%")
computername = objShell.ExpandEnvironmentStrings("%computername%")
folderName = "Listary_x64"
appName = "Listary.exe"
content = fso.OpenTextFile(FILEIN,1,True,-2).ReadAll()
output = Replace(content,"_CURRENTUSER_",username,1,-1,1)
output = Replace(output,"_COMPUTERNAME_",computername,1,-1,1)
output = Replace(output,"_FOLDERNAME_",folderName,1,-1,1)
output = Replace(output,"_APPNAME_",appName,1,-1,1)
output = Replace(output,"%USERNAME%",username,1,-1,1)
fso.OpenTextFile(FILEOUT,2,True,-2).Write(output)
Set fso = Nothing
Set objShell = Nothing
moin,
Bei mir rennt Dein Batch in weniger als einer Sekunde durch.
Eine Zeile hinter der ersten Forschleife fehlt ein exit /b, sonst hast Du zuviel in der XML stehen.
Ist das XML einn Unicodefile?
wenn nicht ,dann:
Lass Überflüssige Anweisungen set weg. Kostet dann auch weniger Zeit.
Wenn Du durch zeitige Variablenauflösung die Umgebungsvariablen im XML haben willst,
ersetze den Unterstrich durch Prozent und löse durch einen Call die Variablen auf.
Schreibe in Die XML mit einmal Handle öffnen.
Gruß Phil
Bei mir rennt Dein Batch in weniger als einer Sekunde durch.
Eine Zeile hinter der ersten Forschleife fehlt ein exit /b, sonst hast Du zuviel in der XML stehen.
Ist das XML einn Unicodefile?
wenn nicht ,dann:
FOR /F "usebackq tokens=* delims=" %%F IN ("%WorkingDir%\%xmlFileGeneralized%") DO ...
Wenn Du durch zeitige Variablenauflösung die Umgebungsvariablen im XML haben willst,
ersetze den Unterstrich durch Prozent und löse durch einen Call die Variablen auf.
Schreibe in Die XML mit einmal Handle öffnen.
@ECHO OFF & COLOR 0F & CLS
echo on
@ECHO Batch: %~0 & ECHO.
SETLOCAL EnableDelayedExpansion
REM ########################################################
REM ### Declare Variables ##################################
REM ########################################################
REM ### Store Directory Paths ##############################
CD /D %~dp0
SET WorkingDir=%CD%
PUSHD..
SET ParentDir=%CD%
POPD
REM ### End Variables ######################################
SET "vSchtasks=%windir%\System32\schtasks.exe"
SET "taskName=Listary"
SET "folderName=Listary_x64"
SET "appName=Listary.exe"
SET "xmlFile=Task.xml"
SET "xmlFileGeneralized=Task [Generalized].xml"
REM ### Admin Check ########################################
REG QUERY "HKU\S-1-5-19" >NUL 2>NUL
IF %ERRORLEVEL% NEQ 0 COLOR 4F
REM Substitute _COMPUTERNAME_ and _CURRENTUSER_ with the current values
set "CURRENTUSER=%USERNAME%"
DEL /F "%WorkingDir%\%xmlFile%" >NUL 2>NUL
3>"%WorkingDir%\%xmlFile%" (
FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO (set "In=%%F"
call set "In=!In:_=%%!"
>&3 echo !In!
) )
exit /b
Gruß Phil