2011-08-09 23 views
22

que quieren crear un archivo por lotes, batch.bat, que acepta 2 argumentos obligatorias:¿Cómo volver al directorio original después de invocar el directorio de cambios en el lote de DOS?

  • %1 representa una ruta relativa al directorio actual.
  • %2 representa un filaname.

Supongamos que el directorio actual es father\me\.

usuario puede utilizar este lote de la siguiente manera:

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

La descripción del trabajo de batch.bat es el siguiente.

  1. Se traslada a %1 directorio,
  2. itera todos *.tex de archivos en el directorio %1.
  3. Guarda el resultado en el directorio antes de moverlo.

El siguiente es el código incompleto:

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

Cómo volver al directorio original después de la invocación de cambio de directorio en DOS por lotes?

Respuesta

34

Si desea REGRESAR al directorio original, realice el primer cambio con PUSHD y regrese con POPD. Es decir, se mueve a 1% directorio deben ser logrados con

PUSHD %1 

en lugar de CD 1%, y el retorno se logra con

POPD 

en lugar de CD dónde?

Si desea acceder al directorio original después cambió, almacenarlo en una variable de esta manera:

SET ORIGINAL=%CD% 

y utilizar% ORIGINAL% más adelante, por ejemplo:

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

+1: adicionalmente PUSHD se utiliza para CD en unidades conectadas a la red, ya que CD no te permitirá hacerlo. – Mechaflash

+2

¿Dónde estaba ese comentario hace un año cuando estaba usando lotes y tenía que trabajar con unidades en red? +100 si pudiera – WernerCD

1

Puede siempre configure% cd% en una variable antes de cambiar directorios:

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

En la mayoría de los casos, crear una variable con el directorio se utiliza en Scripts por lotes. Si el script es semi-extenso, definiré mis variables al comienzo del script que incluye rutas importantes, archivos, subs y/o comandos largos.

@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 

Sin embargo, PUSHD y POPD son excelentes soluciones si es corto y dulce.

11

Definitivamente PUSHD/POPD es la forma preferida de hacerlo. Pero hay una característica (indocumentado?) De SETLOCAL/ENDLOCAL que logra lo mismo (además de todo lo demás SETLOCAL lo hace).

Si cambia el directorio después de un SETLOCAL, entonces volverá al directorio original al ENDLOCAL.

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

Una otra cosa con SETLOCAL que es documentados - Cualquier SETLOCAL dentro de un llamado lote o: rutina etiqueta será terminada con un ENDLOCAL implícita al salir del lote o de rutina. El ENDLOCAL implícito volverá a la carpeta original como un ENDLOCAL explícito.

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 

No recomendaría el uso de SETLOCAL/ENDLOCAL en lugar de PUSHD/POPD. Pero es un comportamiento del que debes estar consciente.

respuesta al comentario de Johnny

Puede resultar confuso cuando PUSHD/POPD y SETLOCAL/ENDLOCAL se combinan. El ENDLOCAL hace no clara la pila PUSHD, como se evidencia por el siguiente:

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 - No es cierto (al menos no es cierto en Win 7 donde lo probé). La pila pushd se conserva. Ver mi respuesta actualizada. – dbenham

+0

mi mal; Juro que probé eso una y otra vez antes de publicarlo (ya que parecía extraño), pero borré mis scripts de prueba cuando terminé con ellos y ahora no puedo duplicar lo que _pensé_ que estaba viendo ... pushd inigualable/sin embargo, los comandos y las subrutinas de popd aún pueden ser un problema ... – johnny

4
set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE 

chdir /d %ORIGINAL_DIR% 
Cuestiones relacionadas