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

Export eines Files mit Leerzeichen

Frage Entwicklung Batch & Shell

Mitglied: Trigger

Trigger (Level 1) - Jetzt verbinden

21.12.2010 um 15:36 Uhr, 3281 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 ..
Ähnliche Inhalte
Windows Userverwaltung
Export von Gruppenmitgliedern des AD in txt file
gelöst Frage von Hendrik2586Windows Userverwaltung7 Kommentare

Guten Morgen liebe Gemeinde! Ich hab zwar schon ein bisschen gegoogelt, bin aber immer nur auf relativ alte Beiträge ...

Batch & Shell
Powershell export
gelöst Frage von SquenterBatch & Shell5 Kommentare

Hallo, ich muss aus Active Directory eine Liste exportieren, von Usern die eine Telefonnummer haben! Leider exportiert mein Skript ...

Batch & Shell
Leerzeichen im Pfad
Frage von JallioBatch & Shell4 Kommentare

Hallo erneut, ich werde hier echt noch zum Stammkunden Wenn ich den Befehl $body in der WindowsPowerShell ISE ausführe, ...

Batch & Shell
BATCH: Leerzeichen im Registry Pfad
gelöst Frage von 118710Batch & Shell1 Kommentar

Hallo zusammen, dies ist mein erste Beitrag hier und ich hoffe ich bin richtig :P So! Erst ein mal ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 2 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 7 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 8 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 19 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...