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, 1567 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 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Suchen, Ersetzen und Entfernen von Dateiinhalten auf Textbasis (1)

Frage von DanteManor 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 ...

Batch & Shell
gelöst Powershell String Suchen mit Wildcard und Ersetzen (6)

Frage von herrmanndominic zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...