friemler
Goto Top

Ausführen eines Programms mit Dateiname als Parameter aus dem Kopf einer FOR F-Schleife, wenn beide Pfade Leerzeichen enthalten

Hallo Gemeinde,

ich hoffe, mir kann jemand bei diesem Problem helfen. Folgendes Beispiel-Szenario (ich weiß, das man diese spezielle Sache auch anders lösen kann, es geht aber ums Prinzip):

@bastla: Das Szenario wird Dir bekannt vorkommen...

Man hat ein Programm readlink.exe. Das kann aus einer Verknüpfung, z.B. xyz.lnk, das Ziel der Verknüpfung extrahieren und auf der Konsole ausgeben. Den Pfad zur Verknüpfung erwartet das Programm als Parameter. Enthält der Pfad Leerzeichen, muss er in Anführungszeichen eingeschlossen werden.

Man speichert das Programm in einem Ordner, dessen Pfad Leerzeichen enthält, z.B.

E:\Meine Programme\readlink.exe


Die Verknüpfung xyz.lnk liegt auf dem Desktop, Pfad ist also (unter Windows XP):

C:\Dokumente und Einstellungen\User\Desktop\xyz.lnk.


Jetzt möchte man ein Batchscript schreiben, dem man als Parameter den Pfad zu einer Verknüpfung übergeben kann. Der Ordner, in dem das Verknüpfungs-Ziel enthalten ist, soll dann in einem Explorer-Fenster geöffnet werden. Also folgender Code:
@echo off

for /f "delims=" %%i in ('E:\Meine Programme\readlink.exe "%~1"') do (  
  start explorer "%%~dpi"  
)

Das Script wird auf dem Desktop unter OLT.bat abgespeichert. Man ruft es dann mit folgendem Befehl auf:
olt "C:\Dokumente und Einstellungen\User\Desktop\xyz.lnk"  

Das Script bricht mit folgender Fehlermeldung ab:
Der Befehl "E:\Meine" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Wenn der Ordner E:\Meine_Programme heißt, funktioniert es.


Wenn man den Code ändert in
@echo off

for /f "usebackq delims=" %%i in (`"E:\Meine Programme\readlink.exe" "%~1"`) do (  
  start explorer "%%~dpi"  
)
erscheint die selbe Fehlermeldung.

Auch die Anführungszeichen mit ^ escapen bringt keinen Erfolg. Weiß jemand eine Lösung?

Gruß
Friemler

Content-ID: 148083

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

Ausgedruckt am: 23.11.2024 um 11:11 Uhr

60730
60730 01.08.2010, aktualisiert am 18.10.2012 um 18:43:01 Uhr
Goto Top
Moin,

@bastla: Das Szenario wird Dir bekannt vorkommen...

Also das erste Zeichen kenn ich von "" - auch die Kombination, die darauf folgt.

Aber ich will dir ja Gelegenheit geben, selber drauf zu kommen.

Du hast zwei Kombinationen gepostet - aber es gibt drei davon.
Du mußt jetzt noch noch den Kniff, den du beim zweiten mal genommen hast nehmen.
Minus den Bock, den du bei beiden malen zwischen () nimmst - weglassen und schon läufts.

Gruß
Friemler
Friemler 01.08.2010 um 23:05:59 Uhr
Goto Top
Moin TimoBeil,

den @echo off Befehl habe ich natürlich beim Fehlersuchen weg gelassen. Ich komme einfach nicht drauf, was ich falsch mache.

Gruß
Friemler
bastla
bastla 01.08.2010 um 23:28:01 Uhr
Goto Top
@t-mo
Wenn Du genau schaust, sind die beiden "Böcke" (oder "Einhörner"? face-wink) aber - typographisch - unterschiedlich ...

Grüße
bastla
Friemler
Friemler 01.08.2010 um 23:48:38 Uhr
Goto Top
Hallo ihr beiden,

ich möchte ja schon beweisen, daß ich mir auch Gedanken mache. Also

for /F "delims=" %%i in ('"E:\Meine Programme\readlink.exe" %~1') do  
und
for /F "usebackq delims=" %%i in (`"E:\Meine Programme\readlink.exe" %~1`) do  

führt dazu, daß das Programm readlink ausgeführt wird. Da dann der Pfad zu xyz.lnk aber verhackstückt ist (Leerzeichen dazwischen), bringt das Programm eine Fehlermeldung.

Wenn ich %~1 in Anführungszeichen setze, kommt wieder Datei "E:\Meine" kann nicht gefunden werden.

for /f "delims=" %%i in ('"E:\Meine Programme\readlink.exe %~1"') do  
und
for /f "usebackq delims=" %%i in (`"E:\Meine Programme\readlink.exe %~1"`) do  

führen auch zu Datei "E:\Meine" kann nicht gefunden werden..

Wie gesagt funktioniert es auch, wenn der Pfad zu readlink.exe E:\Meine_Programme lautet (dann nicht in Anführungszeichen eingeschlossen).

Wo sind die Böcke/Einhörner?

Gruß
Friemler
rubberman
rubberman 01.08.2010 um 23:59:26 Uhr
Goto Top
Hallo Friemler,

schieb's mal darauf, dass es schon spät ist.
Ein
for /F "delims=" %%i in ('"E:\Meine Programme\readlink.exe" "%~1"') do  
würde nicht funktionieren?

Grüße
rubberman
Friemler
Friemler 02.08.2010 um 00:04:47 Uhr
Goto Top
Hallo rubberman,

leider nicht, es kommt auch wieder Datei "E:\Meine" kann nicht gefunden werden.

Gruß
Friemler
bastla
bastla 02.08.2010 um 00:05:10 Uhr
Goto Top
@Friemler

Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ... face-sad

Versuch es so:
for /f "usebackq delims=" %%i in ('call "E:\Meine Programme\readlink.exe" %1') do
Grüße
bastla
Friemler
Friemler 02.08.2010 um 00:09:38 Uhr
Goto Top
Hey bastla,

Du bist der Beste, so funktioniert es, allerdings ohne usebackq. Danke!

[Edit]
Also das
for /f "delims=" %%i in ('call "E:\Meine Programme\readlink.exe" "%~1"') do  
und das
for /f "usebackq delims=" %%i in (`call "E:\Meine Programme\readlink.exe" "%~1"`) do  
funktioniert.

Gruß
Friemler
mrtux
mrtux 02.08.2010 um 00:11:24 Uhr
Goto Top
Hi !

Zitat von @Friemler:
Ich komme einfach nicht drauf, was ich falsch mache.

Ähhmmmm....Kopfkratz....Den Satz habe ich doch auch schonmal gelesen... :-P

mrtux
bastla
bastla 02.08.2010 um 00:14:38 Uhr
Goto Top
Hallo Friemler!

Ersteres freut mich, letzteres ist heute (doch nicht, ist ja schon morgen face-wink) schon der zweite Fall von "Verschlimmbesserung beim Posten" - getestet hatte ich nämlich ohnehin ohne "usebackq" (allerdings mit anderen Pfaden, und deshalb beim Posten nochmals Deinen Ansatz kopiert) ...

Was übrigens auch funktionieren müsste (nur für den Fall, dass das aufgerufene Programm unbedingt einen Pfad mit Anführungszeichen haben möchte), wäre:
for /f "delims=" %%i in ('call "E:\Meine Programme\readlink.exe" "%~1"') do
Grüße
bastla
Friemler
Friemler 02.08.2010 um 00:21:28 Uhr
Goto Top
Hallo bastla,

da war ich einen Tick schneller face-wink

Also das man die Sache nur mit einem CALL-Befehl hinkriegt... Da muss wohl wieder der Praktikant bei MS zugeschlagen haben.

Gruß
Friemler
bastla
bastla 02.08.2010 um 00:28:27 Uhr
Goto Top
[OT]
Hallo Friemler!
Da muss wohl wieder der Praktikant bei MS zugeschlagen haben.
Wenn's nur ein Praktikant gewesen wäre ... face-wink

Grüße
bastla
[/OT]
60730
60730 02.08.2010 um 00:40:30 Uhr
Goto Top
Moin,
Zitat von @bastla:
@Friemler

Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ... face-sad

Da hab ich die aber auch gesucht und dachte, die auch dort gefunden zu haben
bzw. die zwei von drei möglichen bezogen sich auf den output von For /?
Demo:

>FOR /F "delims=" %a IN (`"E:\Meine Programme\readlink.exe" "%1"`) DO echo %i
>Die Datei "`"E:\Meine Programme\readlink.exe"" kann nicht gefunden werden.

FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN ("Zeichenkette") DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN (Befehl) DO Befehl [Parameter]

    oder, unter Verwendung der Option "usebackq":

FOR /F ["Optionen"] %variable IN (Dateiensatz) DO Befehl [Parameter]
FOR /F ["Optionen"] %variable IN ('Zeichenkette') DO Befehl [Parameter]
FOR /F ["Optionen"] %variable IN (`Befehl`) DO Befehl [Parameter]
Auch wenn die letzte und die vorletzte Zeile zwar unter "useback" stehen und auf den ersten Blick ähnlich aussehen....
Sie sind es nicht face-wink

>FOR /F "delims=" %a IN ('"E:\Meine Programme\readlink.exe" "%1"') DO echo %i
>Der Befehl "E:\Meine" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Ist ja auch keine Zeichenkette, sondern ein Befehl face-wink

N8
Friemler
Friemler 02.08.2010 um 00:58:43 Uhr
Goto Top
Hallo TimoBeil,

gerade diese Passage der FOR-Hilfe ist ja mal die am meisten irreführende. Ohne usebackq muss ein Befehl, dessen Ausgabe man verarbeiten will, in einfache Anführungszeichen eingeschlossen werden. Das wird falsch erklärt.

Mit usebackq wird eine Zeichenkette in doppelten Anführungszeichen (ohne umschließende umgekehrte Anführungszeichen) als Name einer Datei aufgefasst (der dann auch Leerzeichen enthalten kann), deren Inhalt zeilenweise ausgelesen wird. Das ist nicht mal erwähnt. Hat wohl auch der Praktikant verfasst. face-wink

Gruß
Friemler
Kodiak
Kodiak 24.04.2024 um 08:24:18 Uhr
Goto Top
Hallo, bin gerade auf den Beitrag gestoßen.

Mit Aussagen ... sollte man vorsichtig sein face-big-smile ... und immer auf die armen Praktikanten. face-big-smileface-big-smileface-big-smile

Zitat von @Friemler:
Auch die Anführungszeichen mit ^ escapen bringt keinen Erfolg.
Zitat von @bastla:
Hallo Friemler!
Da muss wohl wieder der Praktikant bei MS zugeschlagen haben.
Wenn's nur ein Praktikant gewesen wäre ... face-wink
Zitat von @Friemler:
Weiß jemand eine Lösung?

Korrekt maskiert klappts auch mit dem Nachbarn. face-wink Man braucht kein useback (geht auch ohne q):

... (' ^" "Befehl" "Dateiensatz" ^" ')  

Läuft mit einfachen (maskierten) Anführungszeichen. Das funktionert ("tokens=*" oder "delims="):

for /f "delims=" %%i in ('^""E:\Meine Programme\readlink.exe" "%~1"^"') do (  

Beispiele:
test 12k

Das es mit CALL auch geht, war mir neu. Wieder mal etwas dazugelernt. face-smile

Gruß
KoDiAk