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

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

Frage Entwicklung Batch & Shell

Mitglied: aes0p.

aes0p. (Level 1) - Jetzt verbinden

12.08.2014, aktualisiert 13.08.2014, 2563 Aufrufe, 13 Kommentare

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: (C\\?\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

Mitglied: colinardo
12.08.2014, aktualisiert um 18:31 Uhr
Hallo aes0p,
z.B. so
01.
@echo off &setlocal 
02.
for /f "tokens=2 delims=: " %%a in ('type "c:\file.txt" ^| findstr /ir "^Schattenkopievolume:" 2^>nul') DO set "VOLUMEPATH=%%a" 
03.
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
Bitte warten ..
Mitglied: aes0p.
13.08.2014, aktualisiert um 08:02 Uhr
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
Bitte warten ..
Mitglied: colinardo
13.08.2014, aktualisiert um 08:52 Uhr
01.
@echo off &setlocal 
02.
for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for=C: ^| findstr /ir "^Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a" 
03.
echo %VOLUMEPATH%
das echo %VOLUMEPATH% ist nur zu deiner Kontrolle.
Das copy echo ..... geht natürlich nicht.

Grüße Uwe
Bitte warten ..
Mitglied: aes0p.
13.08.2014, aktualisiert um 08:40 Uhr
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
Bitte warten ..
Mitglied: colinardo
13.08.2014, aktualisiert um 08:55 Uhr
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:
http://www.administrator.de/forum/windows-server-2008-verweigert-wieder ...
Bitte warten ..
Mitglied: aes0p.
13.08.2014, aktualisiert um 09:10 Uhr
Hey, ja ich bin ein Noob

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.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.08.2014, aktualisiert um 10:09 Uhr
Das Problem war nur dein gesposteter Output 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 .
01.
@echo off &setlocal 
02.
for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for^=C: ^| findstr /i "Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a" 
03.
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!
Bitte warten ..
Mitglied: aes0p.
13.08.2014 um 09:31 Uhr
Perfekt!

Variante 1 funktioniert:

01.
@echo off  &setlocal  
02.
 
03.
for /f "tokens=2 delims=: " %%a in ('type "c:\temp\log.txt" ^| findstr /i "Schattenkopievolume:" 2^>nul') DO set "VOLUMEPATH=%%a"  
04.
 
05.
copy "%VOLUMEPATH%\Windows\file.dat\" "C:\temp" 
06.
 
In Variante 2 wird der vssadmin-Befehl nicht ausgeführt. Ich denke das sollte ich hinbekommen.

01.
echo DANKE!!
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.08.2014, aktualisiert um 10:09 Uhr
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.
Bitte warten ..
Mitglied: aes0p.
13.08.2014, aktualisiert um 10:01 Uhr
Jetzt wird in Variante 2 der Snapshot erstellt, jedoch gibt mir das CLI folgende Meldung aus

01.
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.

01.
C:\test>vssadmin create shadow /for=C: 
02.
vssadmin 1.1 - Verwaltungsbefehlszeilenprogramm des Volumeschattenkopie-Dienstes 
03.
(C) Copyright 2001 Microsoft Corp. 
04.
 
05.
Schattenkopie für "C:\" wurde erfolgreich erstellt. 
06.
    Schattenkopiekennung: {c7e0f4fd-afaa-48f4-ac29-9327dd388b0d} 
07.
    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:

01.
C:\test>test5.bat 
02.
ECHO ist eingeschaltet (ON). 
03.
 
04.
C:\test>for /F "tokens=2 delims=: " %a in ('vssadmin create shadow /for=C: | findstr /i "Schattenkopie-Volumename:" 2>nul') DO set "VOLUMEPATH=%a" 
05.
 
06.
C:\test>set "VOLUMEPATH=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy31" 
07.
 
08.
C:\test> 
09.
 
Bitte warten ..
Mitglied: colinardo
13.08.2014, aktualisiert um 10:01 Uhr
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 ...
Bitte warten ..
Mitglied: aes0p.
13.08.2014 um 10:04 Uhr
Hey,

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

01.
@echo &setlocal  
02.
 
03.
for /f "tokens=2 delims=: " %%a in ('vssadmin create shadow /for^=C: ^| findstr /i "Schattenkopie-Volumename:" 2^>nul') DO set "VOLUMEPATH=%%a"  
04.
 
05.
copy "%VOLUMEPATH%\Windows\verzeichnis1\datei1" "C:\temp" 
06.
 
Bitte warten ..
Mitglied: aes0p.
13.08.2014 um 10:06 Uhr
Alles gut. Case-Sensitive beim Dateinamen ... mein Fehler


Danke dir!!!!!
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...