2010-09-29 21 views
5

Ho un problema nel chiamare un file batch da un altro file batch quando provo a eseguire tutto usando Process.Start. Fondamentalmente io chiamo l'esecuzione di un file batch dal mio c programma # che assomiglia a questo:Includere un file batch in un file batch


call include.bat 

//execute the rest of the batch file here 

Il file include.bat imposta percorsi e può essere utilizzato da un certo numero di altri file batch. Quando eseguo il Process.Start a volte questo funziona e talvolta ottengo ERROR: cannot find include.bat. Prima di tutto qualche idea del perché questo accada? E idee su come risolvere questo problema dal file batch?

risposta

7

Per passare alla directory del file batch si trova in, utilizzare questo:

cd %~dp0 

faccio questo in quasi tutti i miei script batch. In questo modo i percorsi relativi dovrebbero sempre funzionare.

+0

grazie per quello – Dimitris

+0

Puoi contrassegnarlo come risposta se ha risolto il tuo problema. :) – Botz3000

+1

Di solito ho impostato una variabile in modo che lo script sia più leggibile: SET CDIR =% ~ dp0 – djangofan

1

Per prima cosa proverei a utilizzare le informazioni complete sul percorso nell'istruzione di chiamata per include.bat. Se lo risolve, probabilmente non stai semplicemente eseguendo il file batch dalla posizione corretta. Sono sicuro che c'è una capacità di "directory di lavoro" in C#, non sono sicuro di cosa sia.

1

Si imposta ProcessStartInfo.WorkingDirectory (http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx) sul ProcessStartInfo passato a Process.Start?

Poiché talvolta non è possibile trovare include.bat, la directory di lavoro potrebbe essere errata (non la cartella in cui si trova include.bat).

+0

Devo ammettere che non lo faccio. C'è un modo per risolverlo almeno temporaneamente dal file batch? – Dimitris

+0

Usa cd% ~ dp0 come indicato da Botz3000 sopra. –

+0

grazie per quello – Dimitris

2

prima dello script, provare CD /D %~dp0

+1

Il tuo diritto, possibilmente. Il CD potrebbe non funzionare se significa passare a una lettera di unità diversa ma con l'opzione/D, forse lo farebbe. Non l'ho provato ma è un buon pensiero ... – djangofan

2

So che questa è una vecchia questione, ma ho pensato che sarebbe stato la pena notare che l'approccio promosso dalla risposta accettata (vale a dire cambiare la directory di lavoro) può non essere sempre appropriato.

Una migliore generale approccio è quello di fare riferimento alle dipendenze dal percorso completo:

call "%~dp0include.bat" 

(Dal% ~ dp0 chiude già con un backslash, non abbiamo bisogno di aggiungere altro.)

Ecco alcuni vantaggi di non cambiando la directory di lavoro:

  1. Il resto del file batch può ancora utilizzare la directory di lavoro originale.
  2. La directory di lavoro originale nel prompt dei comandi viene mantenuta, anche senza "SETLOCAL".
  3. Se il primo file batch viene eseguito tramite un percorso UNC (come "\\ server \ share \ file.bat"), la chiamata a percorso completo avrà esito positivo mentre changing the directory (even with "cd /d") will fail. (Usando pushd/popd avrebbe gestito questo punto, ma hanno una propria serie di problemi.)

Questi vantaggi sono particolarmente importanti per i file batch alias-tipo, anche se non sono così importanti per la situazione specifica che motivato questa domanda.