J'utilise ce script pour trouver le dossier actuel avec son fichier .bat:
for /f %%i in ("%0") do set curpath=%%~dpi
echo %curpath%
cela ne fonctionne pas correctement, si le chemin contient des espaces (D:\Scripts\All Scripts -> récupère uniquement D:\Scripts \, si je place dans le dossier, dont le chemin ne contient pas d'espaces, il récupère le chemin complet) . Comment puis-je le réparer?
2015-03-30: Édité - Les informations manquantes ont été ajoutées
Pour récupérer le répertoire actuel, vous pouvez utiliser la variable dynamique %cd%
qui contient le répertoire actif actuel.
set "curpath=%cd%"
Cela génère une valeur avec une barre oblique inverse de fin pour le répertoire racine et sans barre oblique inverse pour le reste des répertoires. Vous pouvez forcer et mettre fin à la barre oblique inverse pour tout répertoire avec
for %%a in ("%cd%\") do set "curpath=%%~fa"
Vous pouvez également utiliser une autre variable dynamique: %__CD__%
qui renverra l’actuel Active Directory avec une barre oblique inverse de fin.
En outre, rappelez-vous que la variable %cd%
peut avoir une valeur directement assignée. Dans ce cas, la valeur renvoyée ne sera pas le répertoire actuel, mais la valeur attribuée. Vous pouvez empêcher cela avec une référence au répertoire en cours
for %%a in (".\") do set "curpath=%%~fa"
Jusqu'à Windows XP, la variable %__CD__%
a le même comportement. Il peut être écrasé par l'utilisateur, mais au moins à partir de Windows 7 (je ne peux pas le tester sous Vista), toute modification du %__CD__%
est autorisée, mais lorsque la variable est lue, la valeur modifiée est ignorée et l'actuel Active Directory correct. est récupéré (remarque: la valeur modifiée est toujours visible à l'aide de la commande set
).
MAIS tous les codes précédents renverront le Active Directory actuel, pas le répertoire où le fichier de commandes est stocké.
set "curpath=%~dp0"
Il renverra le répertoire où le fichier de commandes est stocké, avec une barre oblique inverse de fin.
MAIS cela échouera si dans le fichier batch la commande shift
a été utilisée
shift
echo %~dp0
Comme les arguments du fichier de commandes ont été décalés, la référence %0
au fichier de commandes en cours est perdue.
Pour éviter cela, vous pouvez extraire la référence au fichier de commandes avant tout décalage ou modifier la syntaxe en shift /1
pour vous assurer que l'opération de décalage démarrera au premier argument, sans affecter la référence au fichier de commandes. Si vous ne pouvez utiliser aucune de ces options, vous pouvez récupérer la référence au fichier de commandes en cours dans un appel à un sous-programme.
@echo off
setlocal enableextensions
rem Destroy batch file reference
shift
echo batch folder is "%~dp0"
rem Call the subroutine to get the batch folder
call :getBatchFolder batchFolder
echo batch folder is "%batchFolder%"
exit /b
:getBatchFolder returnVar
set "%~1=%~dp0" & exit /b
Cette approche peut également être nécessaire si, lorsqu’il est appelé, le nom du fichier de commandes est cité et qu’une référence complète n’est pas utilisée (lire ici ).
for /f "delims=" %%i in ("%0") do set "curpath=%%~dpi"
echo "%curpath%"
ou
echo "%cd%"
Les guillemets doubles sont nécessaires si le chemin contient des caractères &
.
Utilisez ce code
@echo off
:: Get the current directory
for /f "tokens=* delims=/" %%A in ('cd') do set CURRENT_DIR=%%A
echo CURRENT_DIR%%A
(echo this Pour confirmer que ce code fonctionne bien)