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
/ apushd
veces 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
source
se 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
setlocal
en la parte superior de su secuencia de comandos para que se ejecute en su propio contexto; puede usarla con seguridadcd
dentro 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 & popd
porque este último puede fallar si no existe dicho directorio.Además, usar
setlocal
y leendlocal
permite tener múltiples entornos locales, por ejemplo, podría tener:setlocal
cd dir
command
endlocal
Ahora 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
setlocal
al comienzo de su secuencia de comandos por lotes, pero agregaría el hecho de que puede tener múltiples, anidados,setlocal
/endlocal
bloques, 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
cd
to todir2
tiene éxito, por ejemplo .cd
dir2
&&
command
Tenga en cuenta que el bloque
setlocal
/endlocal
crea 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