2015-01-28 12 views
5

Ich habe eine benutzerdefinierte Dateierweiterung erstellt, die ich einem Stapel-Skript zuordnen würde. I verwendenWindows: Dateizuordnung zu Batch-Datei herstellen

ASSOC .myext=MY.FILETYPE 
FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" %1 %* 

jetzt die Batch-Datei "C: \ Pfad \ My \ batch.bat von \" ist ein einfacher Einzeiler

echo %1 

Und grob funktioniert: Doppel eines Klick. Myext-Datei öffnet eine Cmd-Shell, die den Dateipfad widerspiegelt.
Ein Problem tritt jedoch auf, wenn sich die .myext-Datei in einem Pfad befindet, der Leerzeichen enthält: Der zurückgegebene Dateipfad wird abgeschnitten.
Double zitiert die% 1 in der FTYPE-Anweisung scheint nicht zu funktionieren.

FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" "%1" %* 
+0

rufen Sie 'FTYPE MY.FILETYPE = cmd/c" C: \ Pfad \ von \ my \ batch.bat ""% 1 "% *' aus Bat-Datei? – npocmaka

Antwort

5

Doppel zitierte %1 co Richtig, aber es schlägt fehl, da cmd.exe einen Fehler enthält, wenn der Befehl und mindestens ein Parameter Anführungszeichen enthält.
Sie müssen also den Befehl ohne Anführungszeichen eingeben, indem Sie CALL einfügen.

+1

Danke Jeb! Ihre Lösung funktioniert, aber ich denke, es sollte ohne Tilde sein: FTYPE MY.FILETYPE = cmd/c Aufruf "C: \ Pfad \ von \ my \ batch.bat" "% 1"% * –

+1

@FedericoDestefanis Die Tilde ist zum Entfernen von Anführungszeichen ab% 1, das sollte so gemacht werden, dass es immer nur ein Paar von Anführungszeichen gibt, nachdem sie mit "% ~ 1" 'hinzugefügt wurden. sonst könntest du etwas wie "" "C: \ mit Leerzeichen \ xyz" "' – jeb

+0

@FedericoDestefanis bekommen Ich liege falsch! Im FTYPE funktioniert '% ~ 1' nicht wie in einer Batch-Datei, es wird nicht erweitert. – jeb

1

, wenn Sie diese von einer Fledermaus-Datei verwenden versuchen, es zu ändern:

ASSOC .myext=MY.FILETYPE 
FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" "%%1" %%* 

Ich denke, sogar arbeiten

FTYPE MY.FILETYPE="C:\Path\of\my\batch.bat" "%%1" %%* 

sollte.

2

Ändern Sie die Batchdatei "C:\Path\of\my\batch.bat" Inhalt

echo %* 

Ihre ASSOC und FTYPE Aussagen scheinen in Ordnung zu sein.

Bearbeiten accordig zu Monacraft 's Kommentar.

Diese Lösung ist die richtige %1 wird das Dokument Dateiname verweisen, während die %*, um weitere Parameter Referenz wird: Wenn alle weiteren Parameter, die von der Anwendung benötigt werden, können sie als weitergegeben werden %2, %3. Um alle Parameter an eine Anwendung zu übergeben, verwenden Sie%*.

Praktisch für aFile.myext a b c direkt von der Kommandozeile verwenden, obwohl dafür die FTYPE Aussage sollte verwenden

FTYPE MY.FILETYPE = cmd/D/C „C: \ Pfad \ My \ Batch von \. bat "% 1" "% *

um den ersten Parameter zu unterscheiden, wenn Leerzeichen enthalten sind.

Beispiel: mit

ASSOC .xxx=XXXFILE 
rem a bug here FTYPE XXXFILE=%ComSpec% /D /C "d:\bat\xxxbatch.bat "%1"" %* 
rem definitely switched to Jeb's solution as follows 
FTYPE XXXFILE=%comspec% /D /C call "d:\bat\xxxbatch.bat" "%1" %* 

und xxxbatch.bat als

@echo(
@echo %* 
@if "%2"=="" pause 
@goto :eof 

Output folgt:

d:\bat>D:\test\xxxFileNoSpaces.xxx aa bb cc 

"D:\test\xxxFileNoSpaces.xxx" aa bb cc 

d:\bat>"D:\test\xxx file with spaces.xxx" dd ee 

"D:\test\xxx file with spaces.xxx" dd ee 

d:\bat> 
+0

@Monacraft Nein. Diese Lösung ist korrekt, siehe meine Edit – JosefZ

+0

Zumindest auf Win7 können Sie Ihre 'test.xxx' nicht starten, ich bekomme' Die Syntax Ihres Dateinamens, Verzeichnisses oder Laufwerks ist falsch'. Das Hauptproblem ist 'cmd/c" batch.bat ""% 1 "' – jeb

+1

@jeb :) Lesen Sie noch einmal und überprüfen Sie gründlich: 'cmd/c" batch.bat "% 1" "' statt falsch 'cmd/c "batch.bat" "% 1" '. Merken Sie sich die Position von Leerzeichen und '' 'Anführungszeichen. Zumindest auf Win8 ... :) – JosefZ