2011-08-09 13 views
22

Voglio creare un file batch, batch.bat, che accetta 2 argomenti obbligatori:Come tornare alla directory originale dopo aver richiamato la directory di modifica nel batch DOS?

  • %1 rappresenta un percorso relativo alla directory corrente.
  • %2 rappresenta un filaname.

Si supponga che la directory corrente sia father\me\.

utente può utilizzare questo lotto come segue:

  • batch child/grandchild log
  • batch ../brother log

La descrizione del lavoro di batch.bat è la seguente.

  1. Si trasferisce a %1 directory,
  2. itera tutti *.tex file nella directory %1.
  3. Salvare il risultato nella directory prima di spostarsi.

Di seguito è il codice incompleta:

rem batch.bat takes 2 arguments. 
cd %1 
dir /b *.tex > <original directory>\%2.txt 

Come tornare alla directory originale dopo aver richiamato directory cambiamento nel lavoro del DOS?

risposta

34

Se si desidera tornare alla directory originale, eseguire la prima modifica con PUSHD e tornare con POPD. Cioè, si sposta verso% 1 directory devono essere raggiunti con

PUSHD %1 

invece del CD% 1, e il ritorno è realizzato con

POPD 

invece di CD in cui?

Se si desidera accedere alla directory originale dopo cambiato, memorizzarlo in una variabile in questo modo:

SET ORIGINAL=%CD% 

e utilizzare% ORIGINALE% in seguito, ad esempio:

dir /b *.tex > %original%\%2.txt 
+7

+1: inoltre PUSHD viene utilizzato per CD in unità collegate alla rete, come il CD non consente. – Mechaflash

+2

Dov'era quel commento un anno fa quando usavo batch e dovevo lavorare su unità in rete? +100 se potessi – WernerCD

1

Puoi imposta sempre% cd% su una variabile prima di cambiare directory:

set current="%cd%" 
cd "C:\Some\Other\Folder" 
cd "%current%" 

Nella maggior parte dei casi, creando una variabile con la directory è usata negli script batch. Se lo script è semi-lungo, definirò le mie variabili all'inizio dello script che include percorsi importanti, file, sottotitoli e/o comandi lunghi.

@ECHO OFF 
REM Variables 
::Programs 
SET save_attachments=C:\Program Files\APED\Program\save_attachments.vbs 
SET sendemail=C:\Program Files\APED\Program\sendkeys.vbs 
SET tb=C:\Program Files\Mozilla Thunderbird\thunderbird.exe 
SET fox=C:\Program Files\Foxit Software\Foxit Reader\Foxit Reader.exe 
SET spool=C:\WINDOWS\system32\PRNJOBS.vbs 

::Directories 
SET new=C:\Program Files\APED\New 
SET printing=C:\Program Files\APED\Printing 
SET finish=C:\Program Files\APED\Finish 
SET messages=C:\Program Files\APED\Script_Messages 
SET nonpdf=C:\Program Files\APED\NonPDFfiles 
SET errorfiles=C:\Program Files\APED\Error Files 

::Important Files 
SET printlog=C:\Program Files\APED\Script_Messages\PrintLOG.txt 
SET printemail=C:\Program Files\APED\Script_Messages\EmailPrintLOG.txt 
SET errorlog=C:\Program Files\APED\Script_Messages\ErrorLOG.txt 
SET erroremail=C:\Program Files\APED\Script_Messages\EmailErrorLOG.txt 
SET movefiles=C:\Program Files\APED\Script_Messages\MoveFiles.txt 

Tuttavia, PUSHD e POPD sono ottime soluzioni se è breve e dolce.

11

Sicuramente PUSHD/POPD è il modo preferito per farlo. Ma esiste una funzione (non documentata?) Di SETLOCAL/ENDLOCAL che realizza la stessa cosa (oltre a tutto ciò che fa SETLOCAL).

Se si modifica la directory dopo un SETLOCAL, quindi si tornerà alla directory originale su ENDLOCAL.

cd OriginalLocation 
setlocal 
cd NewLocation 
endlocal 
rem we are back to OriginalLocation 

Un altra cosa con SETLOCAL che è documentati - Qualsiasi SETLOCAL all'interno di una chiamata batch o: routine di etichetta sarà terminato con un ENDLOCAL implicito all'uscita dal batch o routine. L'implicito ENDLOCAL tornerà alla cartella originale proprio come un ENDLOCAL esplicito.

cd OriginalLocation 
call :ChangeLocation 
rem - We are back to OriginalLocation because :ChangeLocation did CD after a SETLOCAL 
rem - and there is an implicit ENDLOCAL upon return 
exit /b 

:ChangeLocation 
setlocal 
cd NewLocation 
exit /b 

Non è consigliabile utilizzare SETLOCAL/ENDLOCAL anziché PUSHD/POPD. Ma è un comportamento di cui dovresti essere a conoscenza.

Risposta al commento di Johnny

Si può diventare confuso quando PUSHD/POPD e SETLOCAL/ENDLOCAL sono combinati. L'ENDLOCAL fa non chiaro stack PUSHD, come evidenziato dalla seguente:

setlocal 
cd test 
@cd 
pushd new 
@cd 
endlocal 
@cd 
popd 
@cd 

--OUTPUT--

D:\test>setlocal 

D:\test>cd test 
D:\test\test 

D:\test\test>pushd new 
D:\test\test\new 

D:\test\test\new>endlocal 
D:\test 

D:\test>popd 
D:\test\test 
+0

@johnny - Non vero (almeno non vero su Win 7 dove ho provato). Lo stack pushd è conservato. Vedi la mia risposta aggiornata. – dbenham

+0

mio cattivo; Giuro di averlo provato più volte prima di postare (dal momento che sembrava strano), ma ho cancellato i miei script di test quando avevo finito con loro e ora non posso duplicare quello che pensavo di vedere ... push ineguagliato/popd all'interno di script o subroutine può ancora essere un problema, anche se ... – johnny

4
set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE 

chdir /d %ORIGINAL_DIR% 
Problemi correlati