fusseler
Goto Top

Variableninhalt im DOS-Batch kürzen

Guten Tag!,
ich habe da beim DOS-Batch ein kleines Problem...
Das Batch bekommt eine Variable %5 durch ein anderes Programm übergeben (dort kann ich leider nicht eingreifen, das mal vorneweg);
diese Variable enthält einen Pfad, der ebenfalls inhaltlich nie gleich ist.
Jetzt wird leider ein " vor und hinter der Pfadangabe mitgeliefert, sodass ich diesen nicht für weitere Funktionen nutzen kann.

Ich versuche, beherrsche aber einfach nicht den set-Befehl von DOS, um die Variable in eine ohne "..." umzubasteln. Aber - es klappt einfach nicht!

Das Anführungszeichen steht immer am Anfang und Ende der Variablen; der Inhalt ist nicht identisch und hat leider auch eine unterschiedliche Länge.

Könnte mir jemand nen Tipp geben?

Vielen Dank!

Content-Key: 37315

Url: https://administrator.de/contentid/37315

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: Biber
Biber 04.08.2006 um 11:08:04 Uhr
Goto Top
Moin Fusseler,

falls es ein Batch diesseits von Win95/98/ME ist:

::----snipp HandleInputParmsDemo.bat
@Echo InParams [1:[%1] [2:[%2]] [3:[%3]
@Echo Behandelte InParams: [1:[[%~1] [2:[%~2]] [3:[%~3]
::----snapp HandleInputParmsDemo.bat
Demo:

(=11:05:32  D:\temp=)
>HandleInputParmsDemo.bat eins zwei "%userprofile%"  
InParams [1:[eins] [2:[zwei]] [3:["C:\Dokumente und Einstellungen\Biber"]  
Behandelte InParams: [1:[[eins] [2:[zwei]] [3:[C:\Dokumente und Einstellungen\Biber]
(=11:05:46  D:\temp=)

HTH
Biber
Mitglied: Fusseler
Fusseler 04.08.2006 um 11:28:58 Uhr
Goto Top
Uff. Danke für die schnelle Antwort. Ist übrigens ein 2003-Srv., ist das in diesem Fall nicht unwichtig?
Bitte nicht bös sein - aber ich verstehe die Parameterbehandlung leider nicht - könntest Du das mal kurz kommentieren? Dann würde es mir leichter fallen, die Übertragung auf meine Anwendung vornzunehmen...

Nochmal - besten Dank!

-Fusseler
Mitglied: Biber
Biber 04.08.2006 um 11:46:26 Uhr
Goto Top
Also, Fusseler,

kurz kommentiert:
1)
bitte angewöhnen: DOS-Prompt, DOS-Variablen, DOS-Batch gibt es noch bis inclusive Win95/98/ME. Da hieß den Command-Interpreter noch COMMAND.com wie auch vorher ab DOS 2.0.
Seit Win NT; spätestens aber seit Win2000 gibt es alternativ und als Default die CMD.exe als "Eingabeaufforderung" oder oder "Kommandozeile" oder Shell.
Entsprechend dann die CMD-Variablen etc.

2) Für die CMD.exe sind die Funktionalitäten massiv erweitert worden- und M$ hat öffentlich bekundet, dass wohl doch nicht alles über Klicki-Bunti-GUI abzufackeln ist, speziell beim administrativen Tagesgeschäft.
Bei diesem Vista-Geraffel soll das Ganze mit der Monad-Shell noch einmal einen qualitativen Quantensprung erleben.
[Wenn denn Vista jemals kommt.... *lach*]

3) Was CMD-Variablen angeht, gibt es z.B. bei Eingabe von "SET /?" oder "FOR /?"oder "CMD /?" oder "CALL /?" am CMD-Prompt eine ellenlange und gute (=nicht von M$-Übersetzungsprogrammen generierte) Hilfe.

In den letzten 30 Zeilen der FOR/?-Hilfe steht zum Beispiel:
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:

    %~I         - Expandiert %I und entfernt alle umschließenden
                  Anführungszeichen (").  
....
Ähnliches steht bei CALL /? bezogen auf die Parameter %1....%9
Diese Syntax habe ich oben angewendet.

Thats all.
Gruß
Biber
Mitglied: Fusseler
Fusseler 04.08.2006 um 13:49:43 Uhr
Goto Top
Hallo Biber,

erstmal - besten Dank! Ich arbeite an meiner Syntax, versprochen! face-smile

Ich hätte da jetzt mal jetzt folgenden Batch konstruiert:

@echo off
:: setze umgebungsvariable zum test ::
set "j="c:\temp\datei.txt""

::
echo %j%
echo %~j%

:: öffne die datei und lese aus ::

for "tokens=" %%i in (%~j%) do set "lfdnr=%%i"

:: schreibe die ausgelesen sätze in die datei versand1.txt ::

if exist protokoll.chk echo >> versand1.txt
if exist protokoll.chk echo %lfdnr% >> versand1.txt

Ausgabe:

j="c:\temp\datei.txt" ::soweit ok ::
Die folgende verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~j%) do set "lfdnr=%%i"

Übrigens - anstatt %~j% habe ich %%~j% und %~j versucht... kein Erfolg.

An welcher Stelle ist mein Fehler?
Besten Dank und Gruss,
Fusseler
Mitglied: Biber
Biber 04.08.2006 um 14:06:05 Uhr
Goto Top
Moin Fusseler,

set "j="c:\temp\datei.txt""
hier oben reicht lt. M$-Hilfe auch ein
set j=c:\temp\datei.txt
...was ich immer vermeide, weil sich da möglicherweise ein trailing blank einschleicht.
Ich empfehle immer:
set "j=c:\temp\datei.txt" -->wenn die Variable NICHT in Anführungszeichen sein soll
set j="c:\temp\datei.txt" --> wenn die Variable in Anführungszeichen sein soll

Ich gehe mal bei Dir von einer Variablen in Anführungszeichen aus: [set j="c:\temp\datei.txt" ]
for "tokens=" %%i in (%~j%) do set "lfdnr=%%i"
Hier ist "nur" die Klausel "tokens=" der Fehler.
Diese Klausel gibt es nicht bei einer "reinen" FOR..IN..DO-Anweisung, weil ja bei einen "reinen" FOR..IN..DO..-Anweisung immer eine Aufzählung in der Klammer steht.
In Deinem Fall besteht zwar diese Aufzählung nur aus einem Element ("C:\temp\datei.txt").
Bleibt aber trotzdem eine Aufzählung, für die keine "tokens" oder "Delims" angegeben werden können.

Gruss
Biber
Mitglied: Fusseler
Fusseler 04.08.2006 um 14:24:11 Uhr
Goto Top
Heydo Biber,

nochmals ich...

also:
set "j="c:\temp\datei.txt"" --> die reine Definition [set j="c:\temp\datei.txt"] habe ich aus Gründen der M$-Recommandation genutzt - und sie liefert den Pfad in der gleichen Form, wie der Parameter beim Batch ankommt: Mit Anführungszeichen.


Als token hatte ich übrigens "tokens=3,24-33" definiert, was direkt aus dem Prompt und mit fixem Pfad in der For-Schleife einwandfrei den Wert liefert, der eben geliefert werden soll...
Problem scheint mir doch eher zu sein, dass ich die Syntax der Variablen immer noch nicht richtig setze - eben (%~j%) ... und deswegen der Pfadoperator als falsch interpretiert wird.

Oder? Mir 8-)

Besten Dank für Deinen Support!,
Fusseler
Mitglied: Biber
Biber 04.08.2006 um 14:34:35 Uhr
Goto Top
Nein, nein, Fusseler...
(leider bin ich kein guter Erklärer, sorry):

Beispiel am Prompt:
>for %i in (%j%) do @echo [unbehandelt:] %i ...ohne Anführungszeichen: [%~i]
[unbehandelt:] "c:\test\datei.xyz" ...ohne Anführungszeichen: [c:\test\datei.xyz]  

Bei einer Variablen %j%, %test% oder %userprofile% kannst Du diese Tilde-Syntax nicht verwenden.
Nur bei dynamischen Variablen, d.h. Zählvariablen einer FOR..IN..DO-Anweisung oder den Inputparametern eines Batches/eines geCALLten Blocks.

Siehe oben - eine Tilde auf die "echte", gesetzte Variable %j% ist wirkungslos.
Eine Tilde bei der Zählvariablen %i funktioniert.

Das Beispiel von oben als Batch mit zwei Prozentzeichen vor den Zählvariablen:
>for %%i in (%j%) do @echo [unbehandelt:] %%i ...ohne Anführungszeichen: [%%~i]
[unbehandelt:] "c:\test\datei.xyz" ...ohne Anführungszeichen: [c:\test\datei.xyz]  

Besser?
Biber
Mitglied: Fusseler
Fusseler 04.08.2006 um 15:17:27 Uhr
Goto Top
Hey Biber,
Danke für Deine Geduld - scripten war mir schon immer zuwider... face-wink

Also, ich glaube das richtige Ergebnis müsste das hier sein:
@echo off
:: setze umgebungsvariable zum test ::
set "k="ichbinderpfad""  
echo %k% :: anzeige des pfads auf cmd-ebene  - kontrolle ::
for %%i in (%k%) do @echo %%~i :: zur kontrolle, ohne Anführungszeichen ::
for %%i in (%k%) do set "datei=%%~i" :: setzen der variablen "datei" mit datei + pfad ohne anführungszeichen ::  
echo %datei% :: pfad anzeigen, nur für diesen test::

:: öffne die datei und lese aus ::

for /F "tokens=3,24-33" %%i in (%datei%.x) do set "lfdnr=%%i" :: öffne die datei + extension und lese aus ::  

:: schreibe die ausgelesen sätze in die datei versand1.txt ::

if exist protokoll.chk echo %lfdnr% >> versand1.txt
print /d:lpt2 versand1.txt :: drucke die erstellte datei ::

Im einzelnen Batch hat´s funktioniert - ich atme durch, wenn´s jetzt im Realfall klappt (der leider auf einem Event basiert, den ich nicht steuern kann...)


Falls ich den Thread danach schließen kann:

Danke für Deine Geduld!!! face-smile
Fusseler
Mitglied: Fusseler
Fusseler 07.08.2006 um 11:28:08 Uhr
Goto Top
Also - wunderbar! Der Batchlauf funktioniert reibungslos!

Thread geschlossen, vielen Dank nochmal!
Mitglied: Biber
Biber 07.08.2006 um 11:45:23 Uhr
Goto Top
Moin Fusseler,

freut mich.
Schließe diesen Thread mit Status "Gelöst".

Weiterhin stressarmen Wochenbeginn
Biber