web-dev-qa-db-fra.com

trouver le chemin du dossier actuel - cmd

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? 

28
Alexito

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 ).

44
MC ND
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 &.

12
foxidrive

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)

0
Precious