batch-file - supuesto - prestige loteria nacional
¿Cómo regresar al directorio original después de invocar el directorio de cambios en el lote de DOS? (4)
Quiero crear un archivo por lotes, batch.bat
, que acepte 2 argumentos obligatorios:
-
%1
representa una ruta relativa al directorio actual. -
%2
representa un filaname.
Supongamos que el directorio actual es father/me/
.
El usuario puede usar este lote de la siguiente manera:
-
batch child/grandchild log
-
batch ../brother log
La descripción del trabajo de batch.bat
es la siguiente.
- Se mueve al directorio
%1
, - Itera todos los archivos
*.tex
en el directorio%1
. - Guarde 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 regresar al directorio original después de invocar el directorio de cambios en el lote de DOS?
Definitivamente PUSHD / POPD es la forma preferida de hacer esto. 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
Otra cosa con SETLOCAL que está documentada: cualquier SETLOCAL dentro de una rutina llamada batch o: label terminará con un ENDLOCAL implícito al salir del lote o la 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 usar SETLOCAL / ENDLOCAL en lugar de PUSHD / POPD. Pero es un comportamiento del que debes estar consciente.
Respuesta al comentario de johnny
Puede ser confuso cuando se combinan PUSHD / POPD y SETLOCAL / ENDLOCAL. El ENDLOCAL no borra la pila PUSHD, como se evidencia por lo siguiente:
setlocal
cd test
@cd
pushd new
@cd
endlocal
@cd
popd
@cd
--SALIDA--
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
Si desea REGRESAR al directorio original, haga el primer cambio con PUSHD
y regrese con POPD
. Es decir, los movimientos al directorio% 1 se deben lograr con
PUSHD %1
en lugar de CD% 1, y el retorno se logra con
POPD
en lugar de CD donde?
Si desea ACCEDER al directorio original después de haberlo modificado, guárdelo en una variable de esta manera:
SET ORIGINAL=%CD%
y use% ORIGINAL% más tarde, por ejemplo:
dir /b *.tex > %original%/%2.txt
Siempre puede establecer% cd% en una variable antes de cambiar de directorio:
set current="%cd%"
cd "C:/Some/Other/Folder"
cd "%current%"
En la mayoría de los casos, la creación de una variable con el directorio se utiliza en Batch Scripts. 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.
set ORIGINAL_DIR=%CD%
REM #YOUR BATCH LOGIC HERE
chdir /d %ORIGINAL_DIR%