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

Export eines Files mit Leerzeichen

Frage Entwicklung Batch & Shell

Mitglied: Trigger

Trigger (Level 1) - Jetzt verbinden

21.12.2010 um 15:36 Uhr, 3237 Aufrufe, 8 Kommentare

Hallöle,

ich bin mit meinem Latein am Ende und hab keine Ahnung mehr, wonach ich jetzt noch suchen kann.

Ich habe ein Script geschrieben, was diverse Pfade aus einer Textdatei ausliest und dann in ein ZIP Archiv sichert. Neben den Pfaden, lasse ich auch nach bestimmten Dateiendungen suchen und lasse diese ebenfalls sichern. Das ganze funktioniert fasst gut.
Als Packprogramm kommt 7zip zum Einsatz. 7zip möchte aber die Pfadangaben ohne Laufwerksbuchstaben haben, da sonst die Pfade nicht mitgesichert werden.

Ein kleines Beispiel:
C:\Users\Trigger\*.txt soll gesichert werden. Dann muß ich angeben Users\Trigger\*.txt
7zip sucht jetzt nach allen *.txt Dateien und sichert sie mit vollen Pfad.

Gut habe ich mir gedacht, dann lässt du alles in eine Textzeile schreiben und entfernst die ersten drei Zeichen. Dazu habe ich ganz einfach meine Files.txt, in der meine Sicherungspfade stehen auslesen lassen und Zeile für Zeile suchen lassen. Die Suchergebnisse habe ich dann in eine path.tmp exportiert, welche ich dann durch
01.
  :ProcessLine 
02.
      set "Line=%~1"  
03.
      (echo %Line:~0,0%%Line:~3%)>>%BPATH%\path.txt 
dann bearbeiten lasse und das C:\ oder D:\ usw. löschen lasse. Als Ausgabe in der path.txt kommt dann der richtige Pfad, mit dem dann 7zip arbeiten kann.

Das man Pfade in Batch mit "" angibt, weiß ich. Aber wie ist es denn bei der ECHO Zeile? Wenn ich da "" Zeichen mitgebe, dann setzt sie diese dann an das erste Leerzeichen. Auch hier ein kleines Beispiel, wie die Ausgabe dann aussieht:

C:\Dokumente und Einstellungen soll gesichert werden und steht dann auch in der path.tmp richtig drin. nur nach dem Abschneiden bleibt nur noch Dokumente stehen. Wenn ich %Line:~0,0%%Line:~3% in "" setze, dann bekomme ich "Dokumente". Das gleiche passiert auch mit Dateinamen, die Leerzeichen haben.

Wie kann ich das Umgehen?

Ich poste mal das gesamte Script. Einiges werdet ihr schon von hier kennen. Das Forum war immer meine erste Anlaufstelle, wenn ich Probleme hatte und habe mich dann dem Wissen hier bedient. ;)

01.
@echo off 
02.
setlocal 
03.
chcp 1252 
04.
if not exist %COMPUTERNAME%\logs mkdir %COMPUTERNAME%\logs 
05.
 
06.
Rem Pfad angaben 
07.
 
08.
set "syslw=C:\" 
09.
set "server=\\bresrv02\Backup" 
10.
set "epath=%CD%" 
11.
set "bpath=%CD%\%COMPUTERNAME%" 
12.
set "lpath=%CD%\%COMPUTERNAME%\logs\%DATE%-%COMPUTERNAME%.log" 
13.
set "pex=%CD%\bin" 
14.
 
15.
 
16.
REM Ab hier nichts mehr ändern 
17.
 
18.
 
19.
if exist %BPATH%\path.* del %BPATH%\path.* 
20.
set "path=%path%;%pex%" 
21.
	echo ---- Alte Dateien werden entfernt > %lpath% 
22.
	echo. >> %lpath% 
23.
	echo %time% >> %lpath% && delage32 %bpath%* 2 /recurse >> %lpath% 
24.
	echo. >> %lpath% 
25.
	echo ----- >> %lpath% 
26.
  echo. >> %lpath% 
27.
cls 
28.
TITLE Client Profile Backup 
29.
  echo ******************************************************************** 
30.
  echo *                                                                  * 
31.
  echo *    		      Profil wird gesichert                        * 
32.
  echo *                                                                  * 
33.
  echo ******************************************************************** 
34.
  echo. 
35.
  echo Backup Verzeichnisse werden vorbereitet... 
36.
  echo ---- Text Dateien werden gesichert >> %lpath% 
37.
	echo. >> %lpath% 
38.
	CD /D %syslw% 
39.
  echo Daten werden gesichert. Dieser Vorgang kann ein paar Minuten dauern.   
40.
	for /f "eol=# delims=" %%t in (%EPATH%\Files.txt) do dir /b /s %%t >> %BPATH%\path.tmp 
41.
  for /f "usebackq delims=" %%l in (%BPATH%\path.tmp) do call :ProcessLine %%l  
42.
  for /f "eol=# delims=" %%f in (%BPATH%\path.txt) do 7z.exe a %BPATH%\%DATE%-%COMPUTERNAME%.zip %%f >> %lpath%   
43.
  del %BPATH%\path.* 
44.
	echo. >> %lpath% 
45.
	echo ----- >> %lpath% 
46.
	echo. >> %lpath% 
47.
	 
48.
	 @echo off %debug% 
49.
   setlocal 
50.
   set ll=V T R Q P O N M K J I W X Y Z L U S H G F E D 
51.
   for %%l in (%ll%) do ( 
52.
   set LW=%%l 
53.
   mountvol %%l: /L >nul 
54.
   if errorlevel 1 ( 
55.
      subst | findstr /B "%%l:" > nul 
56.
      if errorlevel 1 ( 
57.
         net use %%l: >nul  2>&1 
58.
         if errorlevel 1 goto gotone 
59.
60.
61.
62.
  echo Kein Laufwerksbuchstabe frei 
63.
  exit /b 
64.
  :gotone 
65.
	  net use %LW%: %SERVER% >NUL 
66.
	  if errorlevel=1 echo Fehler bei der Anbindung zum %SERVER% && goto :eof >> %lpath% 
67.
	  echo Verschiebe Daten auf %SERVER% 
68.
	  %LW%: 
69.
	  if not exist %COMPUTERNAME% mkdir %COMPUTERNAME% 
70.
	  if not exist logs mkdir logs 
71.
    copy /Y %BPATH%\%DATE%-%COMPUTERNAME%.zip %LW%:\%COMPUTERNAME%\ >>%lpath% 
72.
    copy /Y %lpath% %LW%:\logs\ >NUL 
73.
    net use %LW%: /del /yes >NUL 
74.
               
75.
echo. 
76.
echo Sicherung abgeschlossen >>%lpath% 
77.
 
78.
 
79.
  :ProcessLine 
80.
      set "Line=%~1"  
81.
      (echo %Line:~0,0%%Line:~3%)>>%BPATH%\path.txt
Eine Files.txt sieht dann in Etwa so aus:

01.
######## Pfade 
02.
"C:\Users\Trigger\Documents" 
03.
 
04.
 
05.
######## Dateien 
06.
"c:\Users\*.jpg"
Ich hoffe, ihr könnt mir folgen. Wenn nicht, dann versuche ich es nochmal anders zu erklären.

Gruß
Trigger
Mitglied: Biber
21.12.2010 um 16:09 Uhr
Moin Trigger,

wenn du die Laufwerksangabe nicht brauchst in deiner Dateilisten-Datei, dann kannst du auch explizit die "Drive"-Angabe unterdrücken bei den FOR-Anweisungs-Variablen.

Beispiel am CMD-Prompt:
01.
>for %i in ("C:\Users\Trigger\Documents", "Y:\Eigene Dateien\Download") do @echo "%~i" "%~npxi" 
02.
"C:\Users\Trigger\Documents" "\Users\Trigger\Documents" 
03.
"Y:\Eigene Dateien\Download" "\Eigene Dateien\Download"
Was hier "rechts der Schlüsselwortes DO" herausfällt entspricht ja dem, was du du an den Block ":Processline" übergibst.
Genauer gesagt, du übergibst die unveränderte Variable "%%l", was wiederum gleichbedeutend wäre mit "%%~dpnxl" (%l mit Drive, Path, Name, eXtension).
Ohne den "Drive"-Anteil würde heißen "%%~pnxl" (%l mit Path, Name, eXtension).

Dann kommst du nicht ins Trudeln mit Substring-Abzählerei und Anführungszeichen.

Grüße
Biber
Bitte warten ..
Mitglied: Trigger
21.12.2010 um 16:16 Uhr
Biber, das ist ja mal Klasse. Leider habe ich das Script heute nicht mehr zur Verfügung, werde aber morgen gleich mal dran arbeiten.
Aber ich bin mir nicht ganz sicher, ob 7zip mit dem \ am Beginn der Zeile was anfangen kann. Ich teste es aber morgen mal durch.

Danke Dir vielmals!!

Gruß
Trigger
Bitte warten ..
Mitglied: Biber
21.12.2010 um 17:18 Uhr
Moin Trigger,

eine andere Möglichkeit mit hilfe der Tokenzerlegung einer FOR/F-Anweisung wäre
01.
>for /f "delims=\ tokens=1,*" %i in ("C:\Users\Trigger\Documents") do @echo "%~j" 
02.
"Users\Trigger\Documents" 
03.
 
04.
(=17:11:26  D:\temp=) 
05.
>for /f "delims=\ tokens=1,*" %i in ("Y:\Eigene Dateien\Download") do @echo "%~j" 
06.
"Eigene Dateien\Download"
--> So wäre sowohl die Laufwerksangabe wie auch der erste Backslash weg.

Beide Varianten sind aus meiner Sicht les- und wartbarer als diese Substringarie und in beiden Fällen kannst du den Aufruf eines geCALLten Blocks ":Processline" einsparen, da du ja keine stattische Variable (mit SET gesetzte Variable, in deinem Schnipsel %Line%) mehr benötigst.

Grüße
Biber
Bitte warten ..
Mitglied: Trigger
22.12.2010 um 09:38 Uhr
Auf er Kommandozeile funktioniert das ganz gut, aber in einem Batchfile nicht. Ich muß aber gestehen, das ich die Line nicht ganz verstehe, was bei der Fehlersuche extrem suboptimal ist. Wenn ich die Zeile in einer Batch einbaue, dann kommt folgender Fehler:

Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters 
ist ungültig: %~j" 
 
 
Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig 
sind.
Bitte warten ..
Mitglied: Trigger
22.12.2010 um 09:40 Uhr
Ach gott... natürlich benötigt es ja zwei % Zeichen.
Bitte warten ..
Mitglied: Biber
22.12.2010 um 10:54 Uhr
Ööööhmmmja, Trigger,

insgesamt lese ich aus deinem Feedback, dass du meine CMD-Prompt-Beispiele angetestet hast.

Allerdings kann ich nicht recht herauslesen, ob
  • du du dich denn für eine bestimmte Variante entschieden hast
  • dein Skript nun tut, was ein Skript halt tun soll
  • auch nach dem Lesen der FOR /?-Hilfe, auf die dich befreundete Praktikanten verwiesen haben, noch Fragen offen sind
  • deine vorläufig endgültige v002beta RC 5 nun künftigen BätchnovizInnen bereitgestellt wird
  • ob nun ein 6-Personen-WG-Mortadellafarbener Haken an den Thread kann.

Kannst du nochmal klären bitte?

Grüße
Biber
Bitte warten ..
Mitglied: Trigger
22.12.2010 um 11:01 Uhr
Warte noch ein wenig. Sowas will immer gut getestet werden.
Ich werde sehr, sehr sicher die praktikable Lösung hier einstellen. Immerhin möchte ich ja auch, das meine hier gewonnen Erfahrungen jemand anderen helfen können. ;)

Also, bitte noch einen Augenblick geduld. Ich mache das ja auch auf der Arbeit und habe dann noch den Alltag parallel zu bearbeiten.

Gruß
Trigger
Bitte warten ..
Mitglied: Trigger
22.12.2010 um 12:05 Uhr
Also...

ich habe mich dafür entschieden:

01.
for /f "eol=# delims=" %%t in (%EPATH%\Files.txt) do dir /b /s %%t >> %BPATH%\path.tmp 
02.
for /f "eol=# delims=\ tokens=1,*" %%i in (%BPATH%\path.tmp) do @echo "%%~j" >> %BPATH%\path.txt 
03.
for /f "eol=# delims=" %%f in (%BPATH%\path.txt) do 7z.exe a %BPATH%\%DATE%-%COMPUTERNAME%.zip %%f
Zeile 1 liest meine Files.txt aus, in der meine Sicherungspfade und Dateien drinstehen und schreibt eine temporäre Datei
Zeile 2 liest die temporäre Datei aus und schneidet das c:\ ab und schreibt es in die Path.txt
Zeile 3 7zip arbeitet die generierte Liste ab und sichert mit den vollständigen Pfaden

Biber, ich danke Dir vielmals für die kompetente Hilfe.

Gruß
Trigger
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Microsoft Office
gelöst Dropdownlisten in Abhängigkeit mit Leerzeichen im Namen (Datenüberprüfung) (2)

Frage von kevische zum Thema Microsoft Office ...

Administrator.de Feedback
Bug? "m f g" (ohne Leerzeichen) wird auch in URL ersetzt (4)

Frage von emeriks zum Thema Administrator.de Feedback ...

Batch & Shell
Leerzeichen im Pfad (4)

Frage von Jallio zum Thema Batch & Shell ...

Outlook & Mail
gelöst Kompletter Export von Postfach in Outlook. wie mache ich es richtig? (30)

Frage von fireskyer zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...