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

Mitglied: Trigger

Trigger (Level 1) - Jetzt verbinden

21.12.2010 um 15:36 Uhr, 3288 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

Leerzeichen als Delimiter funktioniert nicht, ist es ein Leerzeichen?

gelöst Frage von AcJokerBatch & Shell2 Kommentare

Hallo, ich würde gerne mit diese Textdatei auslesen und in Tokens aufteilen Eigentlich sollte ich so in %%i doch ...

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

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 7 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 10 StundenAdministrator.de Feedback10 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 1 TagGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...