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:
Das Script wird auf dem Desktop unter OLT.bat abgespeichert. Man ruft es dann mit folgendem Befehl auf:
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
erscheint die selbe Fehlermeldung.
Auch die Anführungszeichen mit ^ escapen bringt keinen Erfolg. Weiß jemand eine Lösung?
Gruß
Friemler
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"
)
Auch die Anführungszeichen mit ^ escapen bringt keinen Erfolg. Weiß jemand eine Lösung?
Gruß
Friemler
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148083
Url: https://administrator.de/contentid/148083
Ausgedruckt am: 23.11.2024 um 11:11 Uhr
15 Kommentare
Neuester Kommentar
Moin,
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ß
@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
Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ...
Versuch es so:
Grüße
bastla
Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ...
Versuch es so:
for /f "usebackq delims=" %%i in ('call "E:\Meine Programme\readlink.exe" %1') do
bastla
Hi !
Ähhmmmm....Kopfkratz....Den Satz habe ich doch auch schonmal gelesen... :-P
mrtux
Ähhmmmm....Kopfkratz....Den Satz habe ich doch auch schonmal gelesen... :-P
mrtux
Hallo Friemler!
Ersteres freut mich, letzteres ist heute (doch nicht, ist ja schon morgen ) schon der zweite Fall von "Verschlimmbesserung beim Posten" - getestet hatte ich nämlich ohnehin ohne "
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:
Grüße
bastla
Ersteres freut mich, letzteres ist heute (doch nicht, ist ja schon morgen ) 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
bastla
Moin,
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:
Auch wenn die letzte und die vorletzte Zeile zwar unter "useback" stehen und auf den ersten Blick ähnlich aussehen....
Sie sind es nicht
N8
Zitat von @bastla:
@Friemler
Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ...
@Friemler
Sorry - nicht genau genug gelesen (und daher die Schuld bei den "einhörnigen" Apostrophen gesucht) ...
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.
>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]
Sie sind es nicht
>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 >Der Befehl "E:\Meine" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
N8
Hallo, bin gerade auf den Beitrag gestoßen.
Mit Aussagen ... sollte man vorsichtig sein ... und immer auf die armen Praktikanten.
Korrekt maskiert klappts auch mit dem Nachbarn. Man braucht kein useback (geht auch ohne q):
Läuft mit einfachen (maskierten) Anführungszeichen. Das funktionert ("tokens=*" oder "delims="):
Beispiele:
Das es mit CALL auch geht, war mir neu. Wieder mal etwas dazugelernt.
Gruß
KoDiAk
Mit Aussagen ... sollte man vorsichtig sein ... und immer auf die armen Praktikanten.
Zitat von @Friemler:
Auch die Anführungszeichen mit ^ escapen bringt keinen Erfolg.
Zitat von @bastla:
Hallo Friemler!
Zitat von @Friemler:
Weiß jemand eine Lösung?
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 ... Zitat von @Friemler:
Weiß jemand eine Lösung?
Korrekt maskiert klappts auch mit dem Nachbarn. 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:
Das es mit CALL auch geht, war mir neu. Wieder mal etwas dazugelernt.
Gruß
KoDiAk