highend01
Goto Top

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:
@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?

Content-Key: 225326

Url: https://administrator.de/contentid/225326

Printed on: April 20, 2024 at 00:04 o'clock

Member: colinardo
Solution colinardo Dec 25, 2013 updated at 12:54:06 (UTC)
Goto Top
Hallo Highend01,
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.
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%"  
)
ansonsten nehm ein einfaches VB-Script:
'----------- 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
Grüße Uwe
Member: Highend01
Highend01 Dec 25, 2013 at 12:58:15 (UTC)
Goto Top
Hallo Uwe,

ja, es ist (mit meiner alten Version) wirklich ziemlich seltsam. Man kann der Datei Task.xml beim größer werden (bytetechnisch) direkt zusehen. Vorher lief auf dem System ein Windows 7 x64, da ging es auch quasi instant aber seit dem auf Server 2012 R2 umgestellt wurde, ist es so langsam geworden...

Aber...

Mit deinen Änderungen (ich bin bei der Batch-Variante geblieben) ist es jetzt auch unter dem neuen System wieder "normal" schnell (dauert keine Sekunde) geworden...

Vielen herzlichen Dank für die Mühe (und noch ein paar erholsame Weihnachtstage)!

LG,
Highend
Member: pieh-ejdsch
Solution pieh-ejdsch Dec 25, 2013, updated at Dec 26, 2013 at 23:28:18 (UTC)
Goto Top
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:
FOR /F "usebackq tokens=* delims=" %%F IN ("%WorkingDir%\%xmlFileGeneralized%") DO ...
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.
@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
Member: Highend01
Highend01 Dec 26, 2013 at 23:30:00 (UTC)
Goto Top
Danke Phil!

Du hast Recht, im Original fehlt die exit /b Anweisung tatsächlich... und ja, die .xml liegt bereits im Unicode Format vor.

Das sind viele gute Anregungen, ich werde sie der Reihe nach mal mit einbauen face-smile

Gruß,
Highend