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-Key: 148083

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

Printed on: April 16, 2024 at 22:04 o'clock

Mitglied: 60730
60730 Aug 01, 2010, updated at Oct 18, 2012 at 16:43:01 (UTC)
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ß
Member: Friemler
Friemler Aug 01, 2010 at 21:05:59 (UTC)
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
Member: bastla
bastla Aug 01, 2010 at 21:28:01 (UTC)
Goto Top
@t-mo
Wenn Du genau schaust, sind die beiden "Böcke" (oder "Einhörner"? face-wink) aber - typographisch - unterschiedlich ...

Grüße
bastla
Member: Friemler
Friemler Aug 01, 2010 at 21:48:38 (UTC)
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
Member: rubberman
rubberman Aug 01, 2010 at 21:59:26 (UTC)
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
Member: Friemler
Friemler Aug 01, 2010 at 22:04:47 (UTC)
Goto Top
Hallo rubberman,

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

Gruß
Friemler
Member: bastla
bastla Aug 01, 2010 at 22:05:10 (UTC)
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
Member: Friemler
Friemler Aug 01, 2010 at 22:09:38 (UTC)
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
Member: mrtux
mrtux Aug 01, 2010 at 22:11:24 (UTC)
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
Member: bastla
bastla Aug 01, 2010 at 22:14:38 (UTC)
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
Member: Friemler
Friemler Aug 01, 2010 at 22:21:28 (UTC)
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
Member: bastla
bastla Aug 01, 2010 at 22:28:27 (UTC)
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]
Mitglied: 60730
60730 Aug 01, 2010 at 22:40:30 (UTC)
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
Member: Friemler
Friemler Aug 01, 2010 at 22:58:43 (UTC)
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