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?

Mitglied: Highend01

Highend01 (Level 1) - Jetzt verbinden

25.12.2013, aktualisiert 13:54 Uhr, 1823 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
Microsoft Office
Excel Such- und Vergleichsfunktion
gelöst Frage von oesi1989Microsoft Office15 Kommentare

Hallo zusammen, ich habe 2 Tabellen mit Name, Vorname und Arbeitgeber. 1. Tabelle Name Vorname Geb-Datum Arbeitgeber Straße Ort ...

Exchange Server
Such-Index nach Neuerstellung defekt
Frage von CoverianExchange Server

Guten Morgen zusammen, wir haben hier aktuell ein Problem das mir schlaflose Nächte bereitet. Es handelt sich um einen ...

Batch & Shell
Wlan-adapter such algorithmus in batch
gelöst Frage von TicoWriteBatch & Shell7 Kommentare

Hallo zusammen, Ich möchte einen Wlan-adpater such algorithmus in batch erstellen, dazu fehlt mir aber der befehl in Dos. ...

Exchange Server

Exchange-Fehler: 550 No such recipient here

gelöst Frage von GreysonExchange Server3 Kommentare

Hallo administrator.de, habe seit heute an meinem Exchange die Fehlermeldung: #550 No such recipient here Diese Meldung erhalte ich ...

Neue Wissensbeiträge
Python

Sie meinen es ja nur gut - Microsoft hilft python-Entwicklern auf unnachahmliche Weise

Information von DerWoWusste vor 1 TagPython2 Kommentare

Stellt Euch vor, Ihr nutzt python unter Windows 10 und skriptet damit regelmäßig Dinge. Nach dem Update auf Windows ...

Sicherheits-Tools

TrendMicro Worry-Free Business Security 10.0 SP1 steht in Englisch bereit mit Unterstützung für Windows 10 1903 (May Update)

Information von VGem-e vor 1 TagSicherheits-Tools1 Kommentar

Moin Kollegen, Dann kommt wohl demnächst auch die deutschsprachige/europäische Version zur Auslieferung. Gruß VGem-e

Batch & Shell
PowerShell Konferenz - Videos online
Information von NetzwerkDude vor 1 TagBatch & Shell

Abend, die Tage werden Videos der Talks von der diesjährigen EU Powershell Konferenz hochgeladen, sind einige Interessante dabei: MFG ...

Windows Update

Windows 10 1903 Updates über Wsus erst nach Auswahl weiterer Produktkategorie

Information von Spirit-of-Eli vor 3 TagenWindows Update6 Kommentare

Moin, den Tipp habe ich hier noch nicht gesehen. Er adressiert all diejenigen, die Windows 10 1903 über einen ...

Heiß diskutierte Inhalte
Erkennung und -Abwehr
Unerklärlicher Gestank im EDV-Raum - "neues" Gebäude und keine offenkundige Ursache feststellbar!
Frage von VGem-eErkennung und -Abwehr29 Kommentare

Moin Kollegen, ich habe seit heute Morgen das Problem, dass in unserem EDV-Raum ein total unerklärbarer Gestank herrscht! Ich ...

Verschlüsselung & Zertifikate
Bitlocker oder Veracrypt unter Win10? Was ist hinsichtlich Performance, Sicherheit, Backup und Kompatibilität besser?
Frage von PluwimVerschlüsselung & Zertifikate23 Kommentare

Guten Morgen, bei mir wird demnächst eine neue Platte fällig, weil ich mein Win7-System auf Win10 umstellen will. D.h. ...

LAN, WAN, Wireless
Warum ist die Datenübertragung per WLAN zu bestimmten Servern sehr langsam?
Frage von PluwimLAN, WAN, Wireless18 Kommentare

Hallo Netzwerker, beim Einrichten des Notebooks für einen Bekannten fiel mir auf, dass Downloads per WLAN teilweise extrem lahm ...

Router & Routing
Microsoft Server: Kopierlast auf bestimmte NIC legen für Backup
gelöst Frage von LollipopRouter & Routing15 Kommentare

Guten Tag Mit zwei Servern machen wir eine einfache Datenspiegelung als Teil unseres Backup-Systems. Dazu wünsche ich mir einen ...