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

Variableninhalt im DOS-Batch kürzen

Frage Entwicklung Batch & Shell

Mitglied: Fusseler

Fusseler (Level 1) - Jetzt verbinden

04.08.2006, aktualisiert 07.08.2006, 14779 Aufrufe, 10 Kommentare

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!
Mitglied: Biber
04.08.2006 um 11:08 Uhr
Moin Fusseler,

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

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

01.
(=11:05:32  D:\temp=) 
02.
>HandleInputParmsDemo.bat eins zwei "%userprofile%" 
03.
InParams [1:[eins] [2:[zwei]] [3:["C:\Dokumente und Einstellungen\Biber"] 
04.
Behandelte InParams: [1:[[eins] [2:[zwei]] [3:[C:\Dokumente und Einstellungen\Biber] 
05.
(=11:05:46  D:\temp=)
HTH
Biber
Bitte warten ..
Mitglied: Fusseler
04.08.2006 um 11:28 Uhr
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
Bitte warten ..
Mitglied: Biber
04.08.2006 um 11:46 Uhr
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:
01.
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert. 
02.
Sie können jetzt folgende Syntax verwenden: 
03.
 
04.
    %~I         - Expandiert %I und entfernt alle umschließenden 
05.
                  Anführungszeichen ("). 
06.
....
Ähnliches steht bei CALL /? bezogen auf die Parameter %1....%9
Diese Syntax habe ich oben angewendet.

Thats all.
Gruß
Biber
Bitte warten ..
Mitglied: Fusseler
04.08.2006 um 13:49 Uhr
Hallo Biber,

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

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
Bitte warten ..
Mitglied: Biber
04.08.2006 um 14:06 Uhr
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
Bitte warten ..
Mitglied: Fusseler
04.08.2006 um 14:24 Uhr
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
Bitte warten ..
Mitglied: Biber
04.08.2006 um 14:34 Uhr
Nein, nein, Fusseler...
(leider bin ich kein guter Erklärer, sorry):

Beispiel am Prompt:
01.
>for %i in (%j%) do @echo [unbehandelt:] %i ...ohne Anführungszeichen: [%~i] 
02.
[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:
01.
>for %%i in (%j%) do @echo [unbehandelt:] %%i ...ohne Anführungszeichen: [%%~i] 
02.
[unbehandelt:] "c:\test\datei.xyz" ...ohne Anführungszeichen: [c:\test\datei.xyz]
Besser?
Biber
Bitte warten ..
Mitglied: Fusseler
04.08.2006 um 15:17 Uhr
Hey Biber,
Danke für Deine Geduld - scripten war mir schon immer zuwider...

Also, ich glaube das richtige Ergebnis müsste das hier sein:
01.
@echo off 
02.
:: setze umgebungsvariable zum test :: 
03.
set "k="ichbinderpfad"" 
04.
echo %k% :: anzeige des pfads auf cmd-ebene  - kontrolle :: 
05.
for %%i in (%k%) do @echo %%~i :: zur kontrolle, ohne Anführungszeichen :: 
06.
for %%i in (%k%) do set "datei=%%~i" :: setzen der variablen "datei" mit datei + pfad ohne anführungszeichen :: 
07.
echo %datei% :: pfad anzeigen, nur für diesen test:: 
08.
 
09.
:: öffne die datei und lese aus :: 
10.
 
11.
for /F "tokens=3,24-33" %%i in (%datei%.x) do set "lfdnr=%%i" :: öffne die datei + extension und lese aus :: 
12.
 
13.
:: schreibe die ausgelesen sätze in die datei versand1.txt :: 
14.
 
15.
if exist protokoll.chk echo %lfdnr% >> versand1.txt 
16.
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!!!
Fusseler
Bitte warten ..
Mitglied: Fusseler
07.08.2006 um 11:28 Uhr
Also - wunderbar! Der Batchlauf funktioniert reibungslos!

Thread geschlossen, vielen Dank nochmal!
Bitte warten ..
Mitglied: Biber
07.08.2006 um 11:45 Uhr
Moin Fusseler,

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

Weiterhin stressarmen Wochenbeginn
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Batch und Powershell (2)

Frage von michi-ffm zum Thema Batch & Shell ...

Batch & Shell
gelöst Mittels Batch eine Uhrzeit aus einer .txt auslesen und verabeiten (4)

Frage von Beatzler zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch xls nach aktuellem Datum auslesen und email senden (14)

Frage von michi-ffm zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Verschlüsselung & Zertifikate
gelöst Festplattenverschlüsselung im Ausland (13)

Frage von Nicolaas zum Thema Verschlüsselung & Zertifikate ...

Windows Server
gelöst Microsoft-Lizenz CALs und passendes Server-Betriebssystem (12)

Frage von planetIT2016 zum Thema Windows Server ...

Festplatten, SSD, Raid
gelöst Fehlerhafte Blöcke im RAID 10 (12)

Frage von Kojak-LE zum Thema Festplatten, SSD, Raid ...

Netzwerkgrundlagen
gelöst Cisco SG500 Series LAG hat sich von selbst umgestellt (11)

Frage von Ex0r2k16 zum Thema Netzwerkgrundlagen ...