aes0p.
Goto Top

Batch-Script zum Auslesen eines bestimmten Strings aus bestimmter Zeile aus Text-File

Hallo!

Ich möchte gern via Batch-Script einen String aus einer Text-Datei auslesen. Die Textdatei hat folgenden
Inhalt:

vssadmin 1.1 - Verwaltungsbefehlszeilenprogramm des Volumeschattenkopie-Dienstes
(C) Copyright 2001 Microsoft Corp.

Inhalte der Schattenkopiesatzkennung: {ea56a651-bfdb-485a-bb0a-1bf06438f2d9}
1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit: 12.08.2014 15:21:10
Schattenkopienkennung: {26b2276f-eb8f-4b77-9b20-8e11cd6c7350}
Ursprüngliches Volume: (Cface-smile\\?\Volume{28ab904c-9156-11d9-bd66-806e6f6e6963}\
Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy9
Quellcomputer: xyz
Dienstcomputer: xyz
Anbieter: "Microsoft Software Shadow Copy provider 1.0"
Typ: ClientAccessible
Attribute: Permanent, Clientzug„nglich, Keine automatische Freigabe, Keine Verfasser, Differenziell

Hier interessiert mich nur die Zeile "8" (wenn ich richtig zähle) und dort nur der String: "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy9".

Ich möchte diesen String auslesen und in eine Variable packen um eine Datei aus diesem Pfad unterhalb \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy9\Windows\*.* herauszukopieren. Ich bin ein totaler Batch/ VBS-Neuling und würde mich sehr über einen Vorschlag freuen face-smile

Content-Key: 246297

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

Printed on: April 23, 2024 at 17:04 o'clock

Member: colinardo
colinardo Aug 12, 2014 updated at 16:31:34 (UTC)
Goto Top
Hallo aes0p,
z.B. so
@echo off &setlocal
for /f "tokens=2 delims=: " %%a in ('type "c:\file.txt" ^| findstr /ir "^Schattenkopievolume:" 2^>nul') DO set "VOLUMEPATH=%%a"  
echo %VOLUMEPATH%
p.s. mit diesem Schema lässt sich auch die Ausgabe von "vssadmin" direkt ohne Zwischenschritt in eine Datei verarbeiten.

Grüße Uwe
Member: aes0p.
aes0p. Aug 13, 2014 updated at 06:02:21 (UTC)
Goto Top
Hey Uwe,

danke dir für deine schnelle und hilfreiche Antwort.

Dein Script läuft. Wie kann ich die Log-Datei sauber umgehen, also direkt auf die Ausgabe von "vssadmin" zugreifen?
Die Ausgabe von "vssadmin create shadows /for=C:" sieht ja so aus

vssadmin 1.1 - Verwaltungsbefehlszeilenprogramm des Volumeschattenkopie-Dienstes

(C) Copyright 2001 Microsoft Corp.

Schattenkopie für "C:\" wurde erfolgreich erstellt.
Schattenkopiekennung: {c4df673b-e90c-4345-b961-0ae1508fc50f}
Schattenkopie-Volumename: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy17

C:\>

Das Script müsste dann ja so aussehen:


@echo &setlocal
for /f "tokens=2 delims=: " %%a in ('type "vssadmin create shadow /for=C:"' ^| findstr /ir "^Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a"
copy echo %VOLUMEPATH%\Windows\*.dat c:\temp

Leider funktioniert dies nicht - ich habe da garantiert massig Fehler drin face-smile
Member: colinardo
colinardo Aug 13, 2014 updated at 06:52:05 (UTC)
Goto Top
@echo off &setlocal
for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for=C: ^| findstr /ir "^Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a"  
echo %VOLUMEPATH%
das echo %VOLUMEPATH% ist nur zu deiner Kontrolle.
Das copy echo ..... geht natürlich nicht.

Grüße Uwe
Member: aes0p.
aes0p. Aug 13, 2014 updated at 06:40:34 (UTC)
Goto Top
Ok, verstanden. Nur funktioniert das auch OHNE "copy ..." bei mir leider nicht. Er erstellt auch keine neue Schattenkopie. Es scheint noch etwas zu "haken". Ich möchte ja die Variable %VOLUMEPATH% an einen Befehl zum kopieren einer Datei aus diesem Pfad dranhängen, deshalb dachte ich, ich kann das via

"copy echo %VOLUMEPATH%\Windows\Datei-dat C:\temp" machen. Wie kann ich diese Variable denn sauber an einen zweiten Befehl hängen?

Verdammt face-sad
Member: colinardo
colinardo Aug 13, 2014 updated at 06:55:46 (UTC)
Goto Top
Du hast mich falsch verstanden...
copy "%VOLUMEPATH%\Windows\*.dat" "C:\temp"
checke ansonsten noch mal deinen Code präzise, vermutlich ein Tippfehler bei dir im create shadow-Befehl ...

p.s. Wenn das direkte Ansprechen der Schattenkopie nicht klappt, erstelle einen Link zu dieser mit mklink wie hier beschrieben:
Windows Server 2008 verweigert wiederherstellung von Schattenkopien
Member: aes0p.
aes0p. Aug 13, 2014 updated at 07:10:57 (UTC)
Goto Top
Hey, ja ich bin ein Noob face-smile

Also das habe ich soweit kapiert. Nur funktioniert Script 1 (mit log.txt) und die zweite Variante doch nicht. War oben zu voreilig. Wenn ich die beiden Varianten via Batch ausführe:

@echo off &setlocal

for /f "tokens=2 delims=: " %%a in ('type "C:\log.txt" ^| findstr /ir "^Schattenkopievolume:" 2^>nul') DO set "VOLUMEPATH=%%a"

echo %VOLUMEPATH%

--> hier müsste ja nach meinem Verständnis der Pfad angezeigt werden. Das passiert jedoch nicht.

copy "%VOLUMEPATH%\Windows\file.dat" C:\temp"

--> es wird keine Datei kopiert, da der Pfad nicht ausgelesen/ übergeben wird. Im CLI bekommt ich die Meldung

"Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet
wird.
0 Datei(en) kopiert."

die "log.txt" vorhanden mit richtigem Inhalt.


Genauso verhält es sich bei Variante 2, nur das eben vssadmin nicht ausgeführt wird.

Es handelt sich um einen Win Server 2003 falls das wichtig ist.
Member: colinardo
Solution colinardo Aug 13, 2014 updated at 08:09:05 (UTC)
Goto Top
Das Problem war nur dein gesposteter Output face-wink der einen vermuten ließ das das gesuchte Wort ganz am Anfang der Zeile steht, was aber nicht der Fall ist (es stehen ein paar Leerzeichen davor). Am Smartphone konnte ich das leider nicht prüfen face-smile.
@echo off &setlocal
for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for^=C: ^| findstr /i "Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a"  
copy "%VOLUMEPATH%\Windows\*.dat" "C:\temp"  

p.s. Bitte nutze in Zukunft Code-Tags für deinen Quellcode: <code> Quellcode </code>, ansonsten kommen uns hier eventuell wichtige Sonderzeichen abhanden, wie du siehst!
Member: aes0p.
aes0p. Aug 13, 2014 at 07:31:00 (UTC)
Goto Top
Perfekt!

Variante 1 funktioniert:

@echo off  &setlocal 

for /f "tokens=2 delims=: " %%a in ('type "c:\temp\log.txt" ^| findstr /i "Schattenkopievolume:" 2^>nul') DO set "VOLUMEPATH=%%a"   

copy "%VOLUMEPATH%\Windows\file.dat\" "C:\temp"  

In Variante 2 wird der vssadmin-Befehl nicht ausgeführt. Ich denke das sollte ich hinbekommen.

echo DANKE!!
face-smile
Member: colinardo
Solution colinardo Aug 13, 2014 updated at 08:09:15 (UTC)
Goto Top
Zitat von @aes0p.:
In Variante 2 wird der vssadmin-Befehl nicht ausgeführt. Ich denke das sollte ich hinbekommen.
hatte noch einen kleinen Tippfehler nachkorrigiert , sorry. Es fehlt nur ein kleines aber wichtiges ^ vor dem Gleichheitszeichen.
Member: aes0p.
aes0p. Aug 13, 2014 updated at 08:01:49 (UTC)
Goto Top
Jetzt wird in Variante 2 der Snapshot erstellt, jedoch gibt mir das CLI folgende Meldung aus

Das System kann die angegebene Datei nicht finden.

Als würde er den Pfad noch nicht gänzlich auslesen?! Habe nochmal alles geprüft. Die Pfadangabe stimmt und mit manuellem copy geht's.

C:\test>vssadmin create shadow /for=C:
vssadmin 1.1 - Verwaltungsbefehlszeilenprogramm des Volumeschattenkopie-Dienstes
(C) Copyright 2001 Microsoft Corp.

Schattenkopie für "C:\" wurde erfolgreich erstellt.  
    Schattenkopiekennung: {c7e0f4fd-afaa-48f4-ac29-9327dd388b0d}
    Schattenkopie-Volumename: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy30

Wenn ich jedoch im Batch-File die erste Zeile abändere (echo on) geht's wie gewünscht. Hier die Ausgabe des CLI:

C:\test>test5.bat
ECHO ist eingeschaltet (ON).

C:\test>for /F "tokens=2 delims=: " %a in ('vssadmin create shadow /for=C: | findstr /i "Schattenkopie-Volumename:" 2>nul') DO set "VOLUMEPATH=%a"  

C:\test>set "VOLUMEPATH=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy31"  

C:\test>
Member: colinardo
colinardo Aug 13, 2014 updated at 08:01:18 (UTC)
Goto Top
wenn du an dein File einen Backslash anfügst kann das nicht gehen, oh man, hier fehlen dir wirklich die Grundlagen:
"%VOLUMEPATH%\Windows\file.dat\"
mach den weg dann läufts !!!
copy "%VOLUMEPATH%\Windows\file.dat" "C:\temp"
hier getestet läuft einwandfrei ...
Member: aes0p.
aes0p. Aug 13, 2014 at 08:04:55 (UTC)
Goto Top
Hey,

Der Backslash ist vorher schon draussen gewesen. Das Batchfile sieht so aus:

@echo &setlocal 

for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for^=C: ^| findstr /i "Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a"   

copy "%VOLUMEPATH%\Windows\verzeichnis1\datei1" "C:\temp"  
Member: aes0p.
aes0p. Aug 13, 2014 at 08:06:39 (UTC)
Goto Top
Alles gut. Case-Sensitive beim Dateinamen ... mein Fehler face-smile


Danke dir!!!!!