2015-01-28 27 views
5

Ho creato un'estensione di file personalizzata che vorrei associare a uno script batch. Ho usatoWindows: stabilisce l'associazione file al file batch

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

ormai il file batch "C: \ percorso \ \ della mia \ batch.bat" è un semplice one-liner

echo %1 

E grosso modo funziona: doppio clic su un. il file myext fa apparire una shell cmd facendo eco al percorso del file.
Ma un problema sorge quando il file .myext si trova in un percorso contenente spazi: il percorso file echo viene troncato nello spazio.
La doppia citazione del% 1 nell'istruzione FTYPE sembra non funzionare.

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

stai chiamando 'FTYPE MY.FILETYPE = cmd/c "C: \ percorso \ \ della mia \ batch.bat" "% 1" % *' da file bat? – npocmaka

risposta

5

doppio citare %1 è co rrect, ma fallisce in quanto cmd.exe contiene un bug quando il comando e almeno un parametro contiene virgolette.
Quindi è necessario eseguire il comando senza virgolette inserendo CALL.

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

Grazie Jeb! La tua soluzione funziona ma penso che dovrebbe essere senza tilde: FTYPE MY.FILETYPE = cmd/c chiama "C: \ Path \ of \ my \ batch.bat" "% 1"% * –

+1

@FedericoDestefanis La tilde serve per rimuovere le virgolette da% 1, che dovrebbe essere fatto in modo che ci sia sempre una sola coppia di virgolette dopo averle aggiunte con '"% ~ 1 "'. altrimenti puoi ottenere qualcosa come '" "C: \ con spazio \ xyz" "' – jeb

+0

@FedericoDestefanis Ho sbagliato! In FTYPE '% ~ 1' non funziona come in un file batch, non si espande. – jeb

1

se si utilizza questo da un file bat cercare di cambiarlo a:

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

Penso che anche

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

dovrebbe funzionare.

2

Modificare il file batch "C:\Path\of\my\batch.bat" contenuto

echo %* 

vostri ASSOC e FTYPE dichiarazioni sembrano essere tutto a posto.

Modifica secondo le norme IEC commento Monacraft s'.

Questa soluzione è più preciso %1 farà riferimento al documento nome mentre quella %* farà riferimento ad ulteriori parametri: Se ulteriori parametri sono necessari dall'applicazione possono essere passate come%2, %3. Per passare a tutti i parametri a un'applicazione utilizzare%*.

Handy per l'utilizzo di aFile.myext a b c destro da linea di comando, anche se per tale uso la dichiarazione FTYPE dovrebbe essere

FTYPE MY.FILETYPE = cmd/D/C "C: \ percorso \ di \ My \ batch. bat "% 1" "% *

per differenziare il primo parametro se contiene spazi.

Esempio: con

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" %* 

e xxxbatch.bat come segue

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

uscita:

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 Nope. Questa soluzione è corretta, vedi la mia modifica – JosefZ

+0

Almeno su Win7 non puoi avviare il tuo 'test.xxx', ottengo' La sintassi del tuo nome file, directory o unità è sbagliata. Il problema principale è il 'cmd/c" batch.bat ""% 1 "' – jeb

+1

@jeb :) leggi di nuovo e controlla attentamente: 'cmd/c" batch.bat "% 1" "' invece di sbagliato 'cmd/c "batch.bat" "% 1" '. Nota la posizione degli spazi e le virgolette "". Almeno su Win8 ... :) – JosefZ