Rediriger la sortie du lot vers la commande cd
J'ai un fichier de commandes qui génère un chemin. Comment puis-je utiliser le fichier de commandes dans Windows cmd pour modifier le répertoire actuel?
Qu'ai-je essayé:
F:\>cd my-path.bat
The system cannot find the path specified.
F:\>cd (my-path.bat)
The system cannot find the path specified.
F:\>my-path.bat | cd
F:\
The process tried to write to a nonexistent pipe.
Contenu my-path.bat:
@ECHO OFF
@ECHO F:\MyPath\
Réponses
for /f "delims=" %d in ('my-path.bat') do cd /d "%~d"
Remarque: dans un fichier batch, vous devez remplacer% par %%
Pour différents pilotes dont vous avez besoin /ddans votre cdcommande
Si votre dossier / chemin / nom contient un espace / un caractère spécial, utilisez également des «guillemets»
@echo off
echo\"F:\path to your folder"
:: or add/replace echo\"F:\path to your folder" to cd /d ::
cd /d "F:\path\to\folder"
Une alternative serait d'obtenir la sortie dans une boucle, où la chauve-souris ne serait pas modifiée, juste la ligne de commande ...
for /f tokens^=* %i in ('^<con: "my-path.bat"')do cd/d "%~i"
- Se souvenir que les variables de boucle
%idans bat sont%%i:
for /f tokens^=* %%i in ('^<con: "my-path.bat"')do cd/d "%%~i"
- Vous pouvez utiliser arguments (
%*) pour exécuter la variable de votre commande:
@echo off
<con: call %* "F:\path to your folder" 2>nul || echo\"F:\path to your folder"
La 2>nulsuppression de toute erreur possible, et si la dernière commande ne retourne pas 0, un simple écho agira ...
En utilisant l'argument dans votre batte:
my-path.bat cd /d
Quelques lectures supplémentaires:
[√] 'Cd / d'
[√] 'Pour'
[√] 'Pour / F'
[√] Redirections dans le fichier chauve-souris
[√] Exécution conditionnelle ||et&&
[√] Comment puis-je transmettre des arguments à un fichier batch
[√] Comprendre start, '2> nul', 'cmd' et d'autres symboles dans un fichier batch
Pourquoi ne pas simplement changer votre fichier Batch en:
@echo off
cd F:\MyPath\
S'appuyant sur la réponse de LeRouteur , ce qui suit pourrait être un compromis utile:
@echo off
if "%~1" == "." cd /d F:\mypath && goto :eof
echo F:\mypath
L'exécution my-pathfera juste écho au chemin, comme c'est le cas actuellement, mais l'exécution my-path .(c'est-à-dire avec un seul point complet comme paramètre) changera vers ce chemin.
Si vous n'aimez pas que le chemin soit entré deux fois, cela peut être évité en utilisant une variable d'environnement, mais pour le faire "proprement" (sans polluer votre environnement existant), il faut un peu de réflexion:
@echo off
setlocal
set "MYPATH=F:\mypath"
if "%~1" == "." (
endlocal && cd /d "%MYPATH%"
goto :eof
)
echo "%MYPATH%"
L'utilisation de setlocalsignifie que toute modification de l'environnement (par exemple MYPATH) ne sera effectuée que localement: l'exécution endlocalou l'atteinte de la fin du fichier de commandes reviendra à l'environnement d'origine (voir setlocal /?et endlocal /?).
L'utilisation setlocalest très courante dans les fichiers batch afin que les variables d'environnement qu'ils utilisent / modifient ne "polluent" pas l'environnement principal. Le problème est que le répertoire courant fait partie de ce qui est localisé: si vous exécutez cdpendant que setlocalest en vigueur, vous reviendrez à votre répertoire de départ lorsque le script se terminera.
Une solution consiste à placer les commandes endlocalet cdsur la même ligne. La façon dont les fichiers batch sont analysés signifie que l' évaluation de MYPATHse produit alors que l'environnement est encore "local" (donc il a toujours la bonne valeur), mais l' exécution de la cdcommande (en utilisant la valeur obtenue lors de la première passe) ne 'ne se produit qu'après l' endlocalexécution, ce qui signifie que le répertoire sera changé lorsqu'il reviendra à la ligne de commande.
La façon dont je définis MYPATHet utilise sa valeur (entre guillemets) permet au chemin de contenir des espaces. Peut-être pas nécessaire ici, mais c'est une bonne habitude à prendre lors de l'écriture de fichiers batch.
En dernière option, vous pouvez le remplacer cd /dpar pushd. Ce dernier "pousse" le répertoire courant sur une pile avant de passer au nouveau (voir pushd /?). Lorsque vous avez terminé de faire tout ce que vous devez faire, MYPATHvous pouvez alors exécuter popdpour revenir au répertoire à partir duquel vous avez exécuté initialement my-path ..