verdad supuesto saber real prestige premio nacional millions microsoft mega mastercard lottery lotería loteria ithuba confiable como bmw batch-file dos

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.

  1. Se mueve al directorio %1 ,
  2. Itera todos los archivos *.tex en el directorio %1 .
  3. 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%