2013-04-27 13 views
58

Ho un file batch che intendo distribuire ai nostri clienti per eseguire un'attività software.Come trovo la directory corrente di un file batch e quindi la uso per il percorso?

Li distribuiamo come cartella o .zip con i file all'interno. All'interno, ci sono i file batch e un'altra cartella con i file necessari per eseguire il batch.

Normalmente, quando si crea un batch, si digita il percorso in cui si trovano i file. Ma non saprò dove sono i file. I file verranno comunque mantenuti nella cartella principale, ma è necessario che il batch trovi tale cartella per eseguire i file.

Ad esempio: se hanno la cartella principale sul desktop e la eseguono, dovrebbe essere qualcosa come "C:\Users\Username\Desktop" da eseguire. Avresti il ​​CD in batch in quella posizione.

Ma cosa succede se lo eseguono dai documenti? Non conosco il nome utente, quindi devo in qualche modo avere il batch a trovarlo. Qualsiasi codice e/o istruzioni sarebbe fantastico.

+0

Appartiene a voi per descrivere il problema più propriamente. Non posso sostenere il tuo punto. – Endoro

+1

Non riesco a vedere la mia ultima domanda (potrebbe non essere visibile perché l'ho cancellata.) Ho dovuto aggiungere un "/ s" alla linea –

risposta

78

Non c'è bisogno di sapere dove i file sono, perché quando si avvia un file bat la directory di lavoro è la directory in cui è stato lanciato (la cartella "master"), quindi se avete questa struttura:

.\mydocuments\folder\mybat.bat 
.\mydocuments\folder\subfolder\file.txt 

E l'utente avvia il "mybat.bat", la directory di lavoro è "\ Documenti \ cartella", in modo che solo bisogno di scrivere il nome sottocartella nello script:

@Echo OFF 
REM Do anything with ".\Subfolder\File1.txt" 
PUSHD ".\Subfolder" 
Type "File1.txt" 
Pause&Exit 

in ogni caso, il la directory di lavoro è memorizzata nella variabile "% CD%" e la directory in cui è stato avviato il blocco è archiviata d sull'argomento 0. Quindi se volete sapere la directory di lavoro su qualsiasi computer si può fare:

@Echo OFF 
Echo Launch dir: "%~dp0" 
Echo Current dir: "%CD%" 
Pause&Exit 
+12

Questo è sbagliato: il lancio di un file bat non cambia la directory di lavoro. per funzionare se apri una finestra di comando, cambia la directory corrente con quella dello script batch e poi avvialo digitandone il nome. Un'alternativa che non funziona è l'immissione di "CD C: \ Temp "e quindi" C: \ Scripts \ MyScript.bat ". Questo lancerà MyScript, ma la directory di lavoro NON sarà la directory di avvio. Analogamente, l'avvio di script batch da Windows Explorer non modifica automaticamente la directory di lavoro. – christutty

+1

Fatto divertente: se si scrive uno script batch per eliminare un gruppo di DLL di compilazione, quindi eseguirlo da explorer, verrà eseguito nella directory corrente come file. Ma se non è possibile eliminare le DLL di compilazione perché "accesso negato" e si tenta di eseguire lo script batch da explorer come amministratore, verrà eseguito in C: \ Windows \ System32. E quindi eliminare le DLL. – Sorensen

6

Prova a yourbatch

set "batchisin=%~dp0" 

che dovrebbe impostare la variabile alla posizione del lotto.

+0

grazie per tutto il vostro aiuto .Ma nessuno di questi ha funzionato. collegamenti ad altri lotti sotto la stessa cartella master, ma all'interno di una sottocartella Quando digito il numero nel menu nel batch principale, non è in grado di mettere i BAT nelle sottocartelle. –

+0

@Ryan aggiorna la tua domanda a postare la struttura della cartella – ElektroStudios

35

Si può anche fare

Pushd "%~dp0" 

che tiene anche in esecuzione da un percorso UNC in considerazione.

+2

grazie per questo, stava avendo problemi con il numero uno –

+1

Questo ha funzionato per me quando il pipistrello è stato lanciato come amministratore –

45

ElektroStudios risposta è un po 'fuorviante.

"quando si avvia un file bat, la directory di lavoro è la dir dove è stata avviata" Questo è vero se l'utente fa clic sul file batch in explorer.

Tuttavia, se lo script viene chiamato da un altro script utilizzando il comando CALL, la directory di lavoro corrente non cambia.

Così, dentro lo script, è meglio usare% ~ dp0subfolder \ file1.txt

Si prega di notare, inoltre, che% ~ dp0 si concluderà con una barra rovesciata quando lo script corrente non si trova nella directory di lavoro corrente. Quindi, se avete bisogno il nome della directory, senza una barra rovesciata finale, si potrebbe usare qualcosa come

call :GET_THIS_DIR 
echo I am here: %THIS_DIR% 
goto :EOF 

:GET_THIS_DIR 
pushd %~dp0 
set THIS_DIR=%CD% 
popd 
goto :EOF 
+0

Perché deve essere in subroutine ??? –

+0

Ho anche sempre avuto l'impressione che la "directory di lavoro" sia ovunque il file .bat sia quando lo si esegue. Ho scoperto oggi che non è vero. Su un nuovo PC, ho scoperto che il semplice fatto di avere un comando "dir" in un file bat non mostrava la directory dove viveva il file bat, ma qualche altra directory. Usando l'istruzione pushd qui prima chiarito questo problema. Grazie! –