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

Mitglied: ooAlbert

ooAlbert (Level 1) - Jetzt verbinden

07.06.2007, aktualisiert 17.06.2007, 24845 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.

mfg
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 ..
Ähnliche Inhalte
Batch & Shell
Batch: Textdatei Zeilenweise auslesen
gelöst Frage von CreatorXBatch & Shell2 Kommentare

Hallo, ich weiß, zu dem Thema gibt es schon unzählige Threads. Ich hab auch einiges dazu gefunden und trotzdem ...

Batch & Shell

Batch Textdatei zeilenweise auslesen und als Variabel setzen

gelöst Frage von m.fesslerBatch & Shell2 Kommentare

Hallo, kann mir bitte jemand auf die Sprünge helfen wie ich eine Textdatei zeilenweise auslesen und diese als verschiedene ...

Batch & Shell

Batch Textdatei Spaltenweise auslesen

Frage von PinkFLuffyUnicornBatch & Shell7 Kommentare

hi, ist es irgendwie möglich anstatt eine Textdatei via Batch Spaltenweise auszulesen und nicht zeilenweise wie das normal ganz ...

Batch & Shell

Textdatei zeilenweise in Variable schreiben

gelöst Frage von goodbytesBatch & Shell20 Kommentare

Hallo, mit einer Batch möchte ich mehrere Laufwerke mappen, abhängig vom Usernamen. Klar könnte ich auch für jeden User ...

Neue Wissensbeiträge
Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 9 StundenSicherheit

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Internet

Datendealing im WWW Tracking Methoden immer brutaler

Information von sabines vor 18 StundenInternet

Interessanter Artikel zum Thema Tracking im WWW und die immer "besseren" Methoden des Trackings. Professor Arvind Narayanan (Princeton-Universität) betreibt ...

Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 1 TagErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 1 TagWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Heiß diskutierte Inhalte
Server
Route-Befehl Unterstützung (unter CMD)
gelöst Frage von FKRR56Server36 Kommentare

Guten Tag , i.M. habe ich Probleme über den CMD-Route-Befehl ein Routing auf einen entfernten Server zuzulassen. Der Server ...

Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1028 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgbornMicrosoft17 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser15 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...