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

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

Frage Entwicklung Batch & Shell

Mitglied: Friemler

Friemler (Level 2) - Jetzt verbinden

01.08.2010, aktualisiert 18.10.2012, 4665 Aufrufe, 14 Kommentare

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:
01.
@echo off 
02.
 
03.
for /f "delims=" %%i in ('E:\Meine Programme\readlink.exe "%~1"') do ( 
04.
  start explorer "%%~dpi" 
05.
)
Das Script wird auf dem Desktop unter OLT.bat abgespeichert. Man ruft es dann mit folgendem Befehl auf:
01.
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
01.
@echo off 
02.
 
03.
for /f "usebackq delims=" %%i in (`"E:\Meine Programme\readlink.exe" "%~1"`) do ( 
04.
  start explorer "%%~dpi" 
05.
)
erscheint die selbe Fehlermeldung.

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

Gruß
Friemler
Mitglied: 60730
01.08.2010, aktualisiert 18.10.2012
Moin,

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

Also das erste Zeichen kenn ich von "irgendwoher" - 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ß
Bitte warten ..
Mitglied: Friemler
01.08.2010 um 23:05 Uhr
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
Bitte warten ..
Mitglied: bastla
01.08.2010 um 23:28 Uhr
@T-Mo
Wenn Du genau schaust, sind die beiden "Böcke" (oder "Einhörner"? ) aber - typographisch - unterschiedlich ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
01.08.2010 um 23:48 Uhr
Hallo ihr beiden,

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

01.
for /F "delims=" %%i in ('"E:\Meine Programme\readlink.exe" %~1') do
und
01.
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.

01.
for /f "delims=" %%i in ('"E:\Meine Programme\readlink.exe %~1"') do
und
01.
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
Bitte warten ..
Mitglied: rubberman
01.08.2010 um 23:59 Uhr
Hallo Friemler,

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

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
02.08.2010 um 00:04 Uhr
Hallo rubberman,

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

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
02.08.2010 um 00:05 Uhr
@Friemler

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
Grüße
bastla
Bitte warten ..
Mitglied: Friemler
02.08.2010 um 00:09 Uhr
Hey bastla,

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

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

Gruß
Friemler
Bitte warten ..
Mitglied: mrtux
02.08.2010 um 00:11 Uhr
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
Bitte warten ..
Mitglied: bastla
02.08.2010 um 00:14 Uhr
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 "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
Bitte warten ..
Mitglied: Friemler
02.08.2010 um 00:21 Uhr
Hallo bastla,

da war ich einen Tick schneller

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

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
02.08.2010 um 00:28 Uhr
[OT]
Hallo Friemler!
Da muss wohl wieder der Praktikant bei MS zugeschlagen haben.
Wenn's nur ein Praktikant gewesen wäre ...

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: 60730
02.08.2010 um 00:40 Uhr
Moin,
Zitat von bastla:
@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.

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

>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

N8
Bitte warten ..
Mitglied: Friemler
02.08.2010 um 00:58 Uhr
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.

Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Windows Server
Skript per GPO ausführen - Berechtigungen? (10)

Frage von honeybee zum Thema Windows Server ...

Batch & Shell
gelöst New-ADUser (optional Parameter) (13)

Frage von mc-doubleyou zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (22)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...