En shell-scripting, si necesito ejecutar un comando desde un directorio, puedo usar una subshell para asegurarme de que regrese al contexto original:
(cd temporary/new/directory ; command)
# now I am still in original directory
¿Se puede hacer esto en archivos por lotes de Windows (o archivos cmd)
Hacer lo mismo en los archivos por lotes me deja en el nuevo directorio.
Puedo hacer:
pushd temporary\new\directory && command && popd
Pero el popd depende del éxito de command.
¿Algunas ideas?

Respuestas:
Si lo haces:
quedará (como usted dice) en la carpeta \ windows. Tratar:
y deberías volver a donde empezaste.
fuente
cd/ apushdveces falla (si el directorio no existe, por ejemplo).pushd \windows && (foobar & popd)puede ser más confiablePor defecto, los archivos por lotes de Windows se ejecutan en el contexto del shell principal (lo cual es inusual para los usuarios de Unix, donde
sourcese necesita un explícito , pero era la única posibilidad en MS-DOS). Esto significa que los cambios de directorio y las variables de entorno también afectan al shell interactivo original.Poner
setlocalen la parte superior de su secuencia de comandos para que se ejecute en su propio contexto; puede usarla con seguridadcddentro de la secuencia de comandos.fuente
()solo agrupa comandos, pero aún los ejecuta en el contexto principal.(setlocal & cd foo & bar)no trabajará; en cambiopushd foo && (bar & popd)sería necesario.Como se mencionó anteriormente,
pushd \windows && (foobar & popd)funcionaría mejor quepushd \windows & foobar & popdporque este último puede fallar si no existe dicho directorio.Además, usar
setlocaly leendlocalpermite tener múltiples entornos locales, por ejemplo, podría tener:setlocalcd dircommandendlocalAhora estaría de vuelta en su directorio original.
fuente
Puede usar
cd -para volver al directorio de trabajo anterior. Y use en;lugar de&&, luego los comandos posteriores no dependerán del éxito de los comandos anteriores.fuente
Aplaudo la sugerencia de Grawity de poner
setlocalal comienzo de su secuencia de comandos por lotes, pero agregaría el hecho de que puede tener múltiples, anidados,setlocal/endlocalbloques, por lo que una respuesta más relevante a la pregunta podría serY, por supuesto, si desea que el comando se ejecute solo si
cdto todir2tiene éxito, por ejemplo .cddir2&&commandTenga en cuenta que el bloque
setlocal/endlocalcrea un entorno localizado, por lo que cualquier variable que establezca o cambie en dicho bloque volverá a su valor anterior después deendlocal.fuente
Puede guardar el directorio actual en una variable. Cambiar y volver a cambiar según el valor de retorno del comando. Por cierto,% CD% devuelve su DIR actual.
fuente