En shell-scripting, si j'ai besoin d'exécuter une commande à partir d'un répertoire, je peux nous un sous-shell pour m'assurer de revenir au contexte d'origine:
(cd temporary/new/directory ; command)
# now I am still in original directory
Cela peut-il être fait dans des fichiers batch Windows (ou des fichiers cmd)
Faire de même dans les fichiers batch me laisse dans le nouveau répertoire.
Je peux faire:
pushd temporary\new\directory && command && popd
Mais le popd dépend du succès de command
.
Des idées?
Réponses:
Si tu fais:
vous serez laissé (comme vous le dites) dans le dossier \ windows. Essayer:
et vous devriez vous retrouver là où vous avez commencé.
la source
cd
/pushd
échoue parfois (si le répertoire n'existe pas, par exemple).pushd \windows && (foobar & popd)
peut être plus fiablePar défaut, les fichiers de commandes Windows sont exécutés dans le contexte du shell parent (ce qui est inhabituel pour les utilisateurs Unix, où un explicite
source
est nécessaire, mais c'était la seule possibilité dans MS-DOS). Cela signifie que les changements de répertoire et les variables d'environnement affectent également le shell interactif d'origine.Placez-
setlocal
le en haut de votre script pour le faire fonctionner dans son propre contexte - vous pouvez alors l'utiliser en toute sécuritécd
à l'intérieur du script.la source
(
)
seules les commandes de groupe, mais toujours les exécuter dans le contexte parent.(setlocal & cd foo & bar)
ne fonctionnera pas; à la placepushd foo && (bar & popd)
serait nécessaire.Comme grawity mentionné précédemment,
pushd \windows && (foobar & popd)
fonctionnerait mieux quepushd \windows & foobar & popd
parce que ce dernier peut échouer s'il n'y a pas un tel répertoire.De plus, l'utilisation de
setlocal
etendlocal
vous permet d'avoir plusieurs environnements locaux, par exemple, vous pourriez avoir:setlocal
cd dir
command
endlocal
Vous serez maintenant de retour dans votre répertoire d'origine.
la source
Vous pouvez utiliser
cd -
pour revenir au répertoire de travail précédent. Et utilisez;
plutôt que&&
, les commandes suivantes ne dépendront pas du succès des commandes précédentes.la source
J'applaudis la suggestion de grawity de mettre
setlocal
au début de votre script batch, mais j'ajouterais le fait que vous pouvez avoir plusieurs blocssetlocal
/ imbriquésendlocal
, donc une réponse plus pertinente à la question pourrait êtreEt, bien sûr, si vous voulez que la commande soit exécutée uniquement si le
cd
todir2
réussit, disons .cd
dir2
&&
command
Notez que le bloc
setlocal
/endlocal
crée un environnement localisé, donc toutes les variables que vous définissez ou modifiez dans un tel bloc reviendront à leur valeur précédente après leendlocal
.la source
Vous pouvez enregistrer le répertoire actuel dans une variable. Modifiez et modifiez en fonction de la valeur de retour de la commande. BTW,% CD% renvoie votre DIR actuel.
la source