Top-Themen

Aktuelle Themen (A bis Z)

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, 1658 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 ..
Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen
gelöst Frage von Raaja89Batch & Shell5 Kommentare

Hallo Zusammen, ich habe einen Textdatei mit vielen aufeinander folgendenden Leerzeichen und wo an diversen Stellen Überschriften stehen. Ungefähr ...

Batch & Shell
Zeichenfolge in Textdatei durch Inhalt einer Umgebungsvariable ersetzen
gelöst Frage von SarekHLBatch & Shell7 Kommentare

Hallo zusammen, wie kann ich mittels Batch in einer Textdatei die Zeichenfolge durch den Inhalt der Umgebungsvariable %username% ersetzen? ...

Linux Tools
Bash: suchen und ersetzen
Frage von SIPSIPLinux Tools14 Kommentare

Hallo zusammen Möchte aus einer riesigen HTML Datei folgenden Strings ersetzen: ^M\ Nun habe ich dieses kleine Script erstellt, ...

Windows Tools
Suche Programm zum dateien suchen und Ersetzen mit Wildcat Suche
gelöst Frage von sfera-haizaWindows Tools5 Kommentare

Grüßt euch, ich nutze zzT. das Programm InfoRapid Suchen & Ersetzen um HTML / PHP Dateien zu durchsuchen bzw. ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 107 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless8 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows 10
Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App
Tipp von kgbornWindows 107 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...