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- Textdatei Zeilenweise auslesen

Frage Entwicklung Batch & Shell

Mitglied: ooAlbert

ooAlbert (Level 1) - Jetzt verbinden

07.06.2007, aktualisiert 17.06.2007, 22086 Aufrufe, 9 Kommentare

For-Schleife übergibt keine Daten

Hi,

ich hab eine TXT in der pro zeile ein dateiname steht, das soll mit eine Batchdatei auslesen und dann jeden wert einzeln an ein Kommandozeilenprogramm übergeben mittels "Start".

Das Problem ist jetzt, die forschleife ließt korrekt die werte aus und ichs eh die sogar auf dem Bildschirm aber es wird nichts an eine verarbeitende variable übergeben, warum auch immer.


Die Schleife sieht so aus:
01.
PUSHD %Pfad1% 
02.
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO ( 
03.
         
04.
	ECHO Quelldatei            :%%i        
05.
	 
06.
	SET Quelle = %%i 
07.
	SET Ziel = %%i 
08.
	echo %Quelle% <=Leere Anzeige 
09.
	 
10.
	START /min pdftk "%Stempel%" background "%Pfad2%%Quelle%" output "%Pfad3%%Ziel%"  
11.
12.
POPD
Da ich der Meinung bin das die Schleife korrekt ist und es mir unklar ist warum diese simple werteübergabe nicht geht, hoffe ich das hier wer eine erklärung hat.

Mit freundlichen Grüßen
Mitglied: Biber
07.06.2007 um 21:00 Uhr
Moin ooAlbert,

die Schleife sieht optisch korrekt aus, das stimmt.
Dennoch ist für den CMD-Interpreter alles innerhalb der Klammern nach dem "FOR /F...DO" nur eine einzige Zeile.
Auch wenn es optisch anders wirkt.
Alle Variablen innerhalb dieser einen einzigen Zeile werden genau einmal aufgelöst und bekommen den Wert, den sie vor Ausführung bzw. Interpretation der Anweisung hatten.
Ausgenommen sind "dynamische Variablen", z.B. die Zählvariablen einer FOR-Anweisung.

Abhilfe a) (recommended) mit CALL :Block
01.
PUSHD %Pfad1% 
02.
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO call :ProcessNext "%%i" 
03.
POPD 
04.
goto :eof 
05.
 
06.
:ProcessNext Erster Parameter heißt dann %1, der zweite %2.... 
07.
         
08.
    ECHO Quelldatei            :%1       
09.
     
10.
    SET "Quelle=%~1" 
11.
    SET "Ziel=%~1" 
12.
    echo %Quelle% <=Leere Anzeige 
13.
     
14.
    START /min pdftk "%Stempel%" background "%Pfad2%%Quelle%" output "%Pfad3%%Ziel%"  
15.
goto :eof 
16.
 
oder b) mit DelayedExpansion und Variablen in !var!-Schreibweise statt %var&
01.
PUSHD %Pfad1% 
02.
setlocal EnableDelayedExpansion 
03.
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO ( 
04.
         
05.
    ECHO Quelldatei            :%%i        
06.
     
07.
    SET "Quelle=%%i" 
08.
    SET "Ziel=%%i" 
09.
    echo !Quelle!  
10.
     
11.
    START /min pdftk "%Stempel%" background "%Pfad2%!Quelle!" output "%Pfad3%!Ziel!"  
12.
13.
POPD
Zu DelayedExpansion: Forumssuche oder im Bereich Batch & Shell stöbern.

Gruß
Biber
Bitte warten ..
Mitglied: ooAlbert
07.06.2007 um 21:33 Uhr
ich hab das zweite beipsiel mal übertragen, jedoch hab ich dann als ausgabe !Quelle! und nicht den wert ... beim "Ziel" ist es genauso. an sich wäre das aber die elegantere lösung als das erste beispiel.

das erste beispiel hat übrogens geklappt
mal angenommen ich hätt da viele dateien die umgeschreibenw erden (1000) wäre es sinnvoll "Start /Wait" zu benutzen oder spielt das keien rolle?
Bitte warten ..
Mitglied: Biber
07.06.2007 um 23:17 Uhr
Moin ooAlbert,

waum das zweite Beispiel nicht klappt, kann ich mir nur auf zwei relativ abwegige Arten herleiten.

Theorie1 [Sehr ungewöhnlich]
An Deinem Rechner sind -warum auch immer- die so genannten CMD-Extensions nicht aktiviert.
Passiert eigentlich nie - die sind defaultmäßig aktiviert und eingefleischte M$-Fans müssten erst nachlesen, wie sich die ausknipsen lassen.
Kannst ja dennoch mal bitte versuchen, die Zusatzzeile
Setlocal EnableExtensions vor der anderen Setlocal-Zeile einzufügen.

Theorie 2: Du hast wie in Deinem Beispiel oben ein Leerzeichen zwischen dem "Set variablennamen" und dem "=". Das funktioniert nicht.

Zu Deiner "Start /wait"-Frage...
Geschmackssache.
Durch Start /Wait wird es natürlich ein Parallelthreading mit dem (ja gewollten) Vorteil, dass Du nicht auf das Ende eines einzelnen pdftk-Prozesses warten musst.
Andererseits ...wenn mehr als 123 pdftk-Parallelinstanzen sich um eine der Windows-Zeitscheiben balgen und alle außerdem noch jeweils ihren Verwaltungsoverhead im Gepäck haben, dann führt es meistens dazu, dass ein im Hintergrund laufender Antiviren-Prozess langsam aber sicher austrocknet und als toter Prozess im Hauptspeicher hängt.
Jedenfalls wenn Du mit (lokalen) Admin-Rechten so etwas lostrittst.
Ist ein Seiteneffekt, der eine Menge über Windows aussagt.

Ich bin da eher Batch-Purist: wenn es denn ein Batch ist, dann heißt das klassischerweise, dass der Batch gestartet wird , dann still vor sich hinschurrt und irgendwann fertig ist.
Batches startet ja normalerweise niemand, der dabei zuguckt und wartet, dass sie fertig werden.
Das ist eher Windows-Style: Auf einen Installationsbalken starren, der anderthalb Stunden auf einer 99%-Anzeige eingefroren ist.

Gruss
Biber
Bitte warten ..
Mitglied: ooAlbert
08.06.2007 um 14:16 Uhr
Ich nochmal...

scheinbar sind an meinem rechner wirklich diese extensions ausgeschaltet da an einem anderen rechner das sofort klappte.

Ich hab da noch eine andere Frage:
Ich wollt die Pfade für quelle und ziel manuell eingeben lassen damit es variabler ist. Da kopierte Pfade aus dem explorer kein abschließendes "\" haben sollte darauf geprüft werden und gegebenenfalls das "\" angehänt werden.

Mein gedanke war das hier:
01.
@echo off 
02.
set "a=c:\programme\ziel" 
03.
 
04.
findstr /I /E /C:"\" %a% 
05.
 
06.
if errorlevel 0 echo nichts0 
07.
if errorlevel 1 echo nichts1 
08.
if errorlevel 2 echo nichts2 
09.
pause
klappt aber nicht
Bitte warten ..
Mitglied: bastla
08.06.2007 um 14:42 Uhr
Hallo ooAlbert!

Da sich die CMD-Shell an sich nicht daran stört, wenn einmal zwei "\" aufeinanderfolgen, könntest Du natürlich einfach schreiben:
01.
set "a=%a%\"
Falls Du aber nur einen "\" am Ende haben willst, müsste folgendes funktionieren:
01.
if "%a:~-1%" neq "\" set "a=%a%\"
Grüße
bastla
Bitte warten ..
Mitglied: ooAlbert
08.06.2007 um 22:23 Uhr
ich hab mal das ausprobiert:

SET /P "a=eingeben:"
echo %a% | findstr /e \

if errorlevel == 1 echo 1
if errorlevel == 2 echo 2
if errorlevel == 0 echo 0

ich bekomm immer Level 1,0 egal was ich eingebe; dürfte nicht immer nur ein Errorlevel erscheinen je nach dem ob was gefunden wurde oder nicht, bzw. 0 wenn "\" vorhanden und 0,1 bei "\" nicht vorhanden?

das hier versteh ich nicht ziemlich kryptisch: if "%a:~-1%" neq "\" set "a=%a%\"
Bitte warten ..
Mitglied: bastla
08.06.2007 um 22:38 Uhr
Hallo ooAlbert!

das hier versteh ich nicht ziemlich kryptisch: if "%a:~-1%" neq "\" set "a=%a%\"
%a:~-1% liefert das letzte Zeichen der Variablen %a% (siehe Hilfe zu "set")
neq = "not equal" = ungleich (siehe Hilfe zu "if")
set "a=%a%\" fügt einen "\" an den Inhalt von %a% an und speichert wieder in %a%

Zu "findstr": Da "\" als Escape-Zeichen bei RegEx-Suche verwendet wird, musst Du "\\" schreiben, wenn nach "\" selbst gesucht werden soll (siehe Hilfe zu "findstr").

Zu "errorlevel": Eine Abfrage auf Errorlevel 0 is eigentlich sinnlos, da gilt (Hilfe zu "if"): "Bedingung ist erfüllt, wenn das zuletzt ausgeführte Programm einen Code größer oder gleich der Nummer zurückgibt." Du kannst aber mit "echo %errorlevel%" den Wert anzeigen lassen.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
17.06.2007 um 00:39 Uhr
Moin ooAlbert,

sind noch Fragen offen oder kann dieser Beitrag geschlossen werden?

Grüße
Biber
Bitte warten ..
Mitglied: ooAlbert
17.06.2007 um 19:01 Uhr
nein ich hät erstmal keine weiter.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch Textdatei Spaltenweise auslesen (7)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch ausgabe zeilenweise stat spaltenweise ausgeben (4)

Frage von sugram zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...