Premièrement, j'ai vu ce sujet mais je ne pouvais pas comprendre cela.
Question:
Il y a un fichier batch D:\path\to\file.bat
avec le contenu suivant:
echo %cd%
pause
La sortie est:
C:\
Ce doit être D:\path\to
Qu'est-ce que je fais mal?
Premièrement, j'ai vu ce sujet mais je ne pouvais pas comprendre cela.
Question:
Il y a un fichier batch D:\path\to\file.bat
avec le contenu suivant:
echo %cd%
pause
La sortie est:
C:\
Ce doit être D:\path\to
Qu'est-ce que je fais mal?
Réponses:
La variable en lecture seule du système %CD%
conserve le chemin de l'appelant du lot, pas l'emplacement du fichier de lot.
Vous pouvez obtenir le nom du script batch lui-même tel que tapé par l'utilisateur avec %0
(par exemple scripts\mybatch.bat
). Des extensions de paramètres peuvent être appliquées à cela, donc %~dp0
retourneront le lecteur et le chemin d'accès au script batch (par exemple W:\scripts\
) et %~f0
renverront le chemin complet (par exemple W:\scripts\mybatch.cmd
).
Vous pouvez faire référence à d'autres fichiers dans le même dossier que le script batch en utilisant cette syntaxe:
CALL %0\..\SecondBatch.cmd
Cela peut même être utilisé dans un sous-programme, Echo %0
donnera l'étiquette d'appel mais, echo "%~nx0"
vous donnera le nom de fichier du script batch.
Quand le %0
variable est développée, le résultat est placé entre guillemets.
stm.sql
dans D:\Dir1\Dir2\stm.sql
. J'ai besoin mysql.exe -u root -p mysql < %cd%\stm.sql
d'exécuter ces commandes stm.sql.
*.bat
ou *.sh
?
D:\Dir1\Dir2\batchfile.bat
et D:\Dir1\Dir2\stm.sql
. le contenu de batchfile.bat est: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
et le contenu stm.sql est quelques commandes MySQL.
echo %~dp0
retournera le chemin vers l'emplacement du lot. echo %~f0
renverra le chemin vers le lot avec le nom de fichier.
Très simple:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
la première ligne du fichier de commandes et
Dans votre fichier .bat:
set mypath=%cd%
Vous pouvez maintenant utiliser la variable %mypath%
pour référencer le chemin d'accès au .bat
fichier. Pour vérifier que le chemin est correct:
@echo %mypath%
Par exemple, un fichier appelé DIR.bat
avec le contenu suivant
set mypath=%cd%
@echo %mypath%
Pause
exécuté à partir du répertoire g:\test\bat
fera écho à ce chemin dans la fenêtre de commande DOS.
Voici ce que j'utilise en haut de tous mes fichiers batch. Je viens de copier / coller à partir de mon dossier de modèles.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
La définition du chemin du fichier de commandes en cours sur% batdir% vous permet de l'appeler dans les commandes suivantes du fichier de commandes en cours, quel que soit l'endroit où ce fichier de commandes passe. L'utilisation de PUSHD vous permet d'utiliser POPD pour définir rapidement le chemin d'accès de ce fichier de commandes à% batdir% d'origine. N'oubliez pas que si vous utilisez% batdir% ExtraDir ou% batdir% \ ExtraDir (selon la version utilisée ci-dessus, en mettant fin ou non à la barre oblique inverse), vous devrez mettre la chaîne entière entre guillemets si le chemin a des espaces (c'est-à-dire "% batdir% ExtraDir" ). Vous pouvez toujours utiliser PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] contient plus de paramètres (% ~).
Notez que l'utilisation de (: :) au début d'une ligne en fait une ligne de commentaire. Plus important encore, l'utilisation de :: vous permet d'inclure des redirecteurs, des canaux, des caractères spéciaux (c'est-à-dire <> | etc) dans ce commentaire.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Bien sûr, Powershell fait cela et bien plus encore.
set batdir=%CD%
). Ce n'est pas correct, car c'est le chemin d'accès à l'appelant, pas le fichier bat lui-même. La seule façon valide d'obtenir le chemin d'accès au fichier bat en cours d'exécution est %~dp0
.