Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Suchen - Ersetzen in einer Textdatei - Beschleunigung möglich?

Frage Entwicklung Batch & Shell

Mitglied: Highend01

Highend01 (Level 1) - Jetzt verbinden

25.12.2013, aktualisiert 13:54 Uhr, 1581 Aufrufe, 4 Kommentare, 2 Danke

Hi,

ich möchte durch eine .bat Datei eine .xml Datei parsen um Ersetzungen vorzunehmen.

Ein Beispiel:
01.
@ECHO OFF & COLOR 0F & CLS 
02.
@ECHO Batch: %~0 & ECHO. 
03.
SETLOCAL EnableDelayedExpansion 
04.
REM ######################################################## 
05.
REM ### Declare Variables ################################## 
06.
REM ######################################################## 
07.
REM ### Store Directory Paths ############################## 
08.
CD /D %~dp0 
09.
SET WorkingDir=%CD% 
10.
PUSHD.. 
11.
SET ParentDir=%CD% 
12.
POPD 
13.
REM ### End Variables ###################################### 
14.
SET "vSchtasks=%windir%\System32\schtasks.exe" 
15.
SET "taskName=Listary" 
16.
SET "folderName=Listary_x64" 
17.
SET "appName=Listary.exe" 
18.
 
19.
SET "xmlFile=Task.xml" 
20.
SET "xmlFileGeneralized=Task [Generalized].xml" 
21.
 
22.
REM ### Admin Check ######################################## 
23.
REG QUERY "HKU\S-1-5-19" >NUL 2>NUL 
24.
IF %ERRORLEVEL% NEQ 0 COLOR 4F 
25.
 
26.
REM Substitute _COMPUTERNAME_ and _CURRENTUSER_ with the current values 
27.
DEL /F "%WorkingDir%\%xmlFile%" >NUL 2>NUL 
28.
FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO CALL :REPLACE "%%F" 
29.
 
30.
:REPLACE 
31.
SET INPUT=%* 
32.
SET OUTPUT=!INPUT:_CURRENTUSER_=%USERNAME%! 
33.
SET OUTPUT=!OUTPUT:_COMPUTERNAME_=%COMPUTERNAME%! 
34.
SET OUTPUT=!OUTPUT:_FOLDERNAME_=%folderName%! 
35.
SET OUTPUT=!OUTPUT:_APPNAME_=%appName%! 
36.
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:
01.
<?xml version="1.0" encoding="UTF-16"?> 
02.
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
03.
  <RegistrationInfo> 
04.
    <Date>2012-08-25T21:36:48.0193137</Date> 
05.
    <Author>_COMPUTERNAME_\_CURRENTUSER_</Author> 
06.
  </RegistrationInfo> 
07.
  <Triggers> 
08.
    <LogonTrigger> 
09.
      <Enabled>true</Enabled> 
10.
      <UserId>_COMPUTERNAME_\_CURRENTUSER_</UserId> 
11.
    </LogonTrigger> 
12.
  </Triggers> 
13.
  <Principals> 
14.
    <Principal id="Author"> 
15.
      <UserId>_COMPUTERNAME_\_CURRENTUSER_</UserId> 
16.
      <LogonType>InteractiveToken</LogonType> 
17.
      <RunLevel>HighestAvailable</RunLevel> 
18.
    </Principal> 
19.
  </Principals> 
20.
  <Settings> 
21.
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
22.
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
23.
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
24.
    <AllowHardTerminate>false</AllowHardTerminate> 
25.
    <StartWhenAvailable>true</StartWhenAvailable> 
26.
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
27.
    <IdleSettings> 
28.
      <StopOnIdleEnd>false</StopOnIdleEnd> 
29.
      <RestartOnIdle>false</RestartOnIdle> 
30.
    </IdleSettings> 
31.
    <AllowStartOnDemand>true</AllowStartOnDemand> 
32.
    <Enabled>true</Enabled> 
33.
    <Hidden>false</Hidden> 
34.
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
35.
    <WakeToRun>false</WakeToRun> 
36.
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> 
37.
    <Priority>7</Priority> 
38.
  </Settings> 
39.
  <Actions Context="Author"> 
40.
    <Exec> 
41.
      <Command>"D:\Users\%USERNAME%\Tools\_FOLDERNAME_\_APPNAME_"</Command> 
42.
    </Exec> 
43.
  </Actions> 
44.
</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?
Mitglied: colinardo
LÖSUNG 25.12.2013, aktualisiert um 13:54 Uhr
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)
01.
FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO @( 
02.
 SET INPUT=%%F 
03.
 SET OUTPUT=!INPUT:_CURRENTUSER_=%USERNAME%! 
04.
 SET OUTPUT=!OUTPUT:_COMPUTERNAME_=%COMPUTERNAME%! 
05.
 SET OUTPUT=!OUTPUT:_FOLDERNAME_=%folderName%! 
06.
 SET OUTPUT=!OUTPUT:_APPNAME_=%appName%! 
07.
 SET OUTPUT=!OUTPUT:%%USERNAME%%=%username%! 
08.
 echo !OUTPUT!>>"%WorkingDir%\%xmlFile%" 
09.
)
ansonsten nehm ein einfaches VB-Script:
01.
'----------- Variables -------- 
02.
FILEIN = "C:\Temp\file.xml" 
03.
FILEOUT = "C:\Temp\file_out.xml" 
04.
'------------------------------- 
05.
Set fso = WScript.CreateObject("Scripting.Filesystemobject") 
06.
Set objShell = CreateObject("Wscript.Shell") 
07.
username = objShell.ExpandEnvironmentStrings("%username%") 
08.
computername = objShell.ExpandEnvironmentStrings("%computername%") 
09.
folderName = "Listary_x64" 
10.
appName = "Listary.exe" 
11.
content = fso.OpenTextFile(FILEIN,1,True,-2).ReadAll() 
12.
output = Replace(content,"_CURRENTUSER_",username,1,-1,1) 
13.
output = Replace(output,"_COMPUTERNAME_",computername,1,-1,1) 
14.
output = Replace(output,"_FOLDERNAME_",folderName,1,-1,1) 
15.
output = Replace(output,"_APPNAME_",appName,1,-1,1) 
16.
output = Replace(output,"%USERNAME%",username,1,-1,1) 
17.
fso.OpenTextFile(FILEOUT,2,True,-2).Write(output) 
18.
Set fso = Nothing 
19.
Set objShell = Nothing
Grüße Uwe
Bitte warten ..
Mitglied: Highend01
25.12.2013 um 13:58 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
LÖSUNG 25.12.2013, aktualisiert 27.12.2013
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.
01.
@ECHO OFF & COLOR 0F & CLS 
02.
echo on 
03.
@ECHO Batch: %~0 & ECHO. 
04.
SETLOCAL EnableDelayedExpansion 
05.
REM ######################################################## 
06.
REM ### Declare Variables ################################## 
07.
REM ######################################################## 
08.
REM ### Store Directory Paths ############################## 
09.
CD /D %~dp0 
10.
SET WorkingDir=%CD% 
11.
PUSHD.. 
12.
SET ParentDir=%CD% 
13.
POPD 
14.
REM ### End Variables ###################################### 
15.
SET "vSchtasks=%windir%\System32\schtasks.exe" 
16.
SET "taskName=Listary" 
17.
SET "folderName=Listary_x64" 
18.
SET "appName=Listary.exe" 
19.
 
20.
SET "xmlFile=Task.xml" 
21.
SET "xmlFileGeneralized=Task [Generalized].xml" 
22.
REM ### Admin Check ######################################## 
23.
  
24.
REG QUERY "HKU\S-1-5-19" >NUL 2>NUL 
25.
IF %ERRORLEVEL% NEQ 0 COLOR 4F 
26.
 
27.
REM Substitute _COMPUTERNAME_ and _CURRENTUSER_ with the current values 
28.
set "CURRENTUSER=%USERNAME%" 
29.
 
30.
DEL /F "%WorkingDir%\%xmlFile%" >NUL 2>NUL 
31.
3>"%WorkingDir%\%xmlFile%" ( 
32.
  FOR /F "tokens=* delims=" %%F IN ('type "%WorkingDir%\%xmlFileGeneralized%"') DO (set "In=%%F" 
33.
    call set  "In=!In:_=%%!" 
34.
    >&3 echo !In! 
35.
)  ) 
36.
exit /b
Gruß Phil
Bitte warten ..
Mitglied: Highend01
27.12.2013 um 00:30 Uhr
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

Gruß,
Highend
Bitte warten ..
Neuester Wissensbeitrag
Windows Update

Windows Update-Suche nach Win7 Neuinstallation wieder schneller

(2)

Erfahrungsbericht von the-buccaneer zum Thema Windows Update ...

Ähnliche Inhalte
Batch & Shell
gelöst Suchen ersetzen mit Sonderzeichen (2)

Frage von GNLen1 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Windows Userverwaltung
gelöst Ausnahmen für FSRM pro User oder für jede Situation möglich? (5)

Frage von M.Marz zum Thema Windows Userverwaltung ...

Heiß diskutierte Inhalte
Hyper-V
gelöst Reiner Hyper- V Server oder lieber Rolle (22)

Frage von Winuser zum Thema Hyper-V ...

Exchange Server
gelöst Bestehende eMails autoamatisch weiterleiten (22)

Frage von metal-shot zum Thema Exchange Server ...

SAN, NAS, DAS
gelöst Synology Version 6.1 Probleme (18)

Frage von Hendrik2586 zum Thema SAN, NAS, DAS ...

Router & Routing
gelöst IP Kamera für drei unabhängige Netzwerke (16)

Frage von ProfessorZ zum Thema Router & Routing ...