web-dev-qa-db-fra.com

Répertoire de démarrage des fichiers de commandes Windows lorsqu'il est "exécuté en tant qu'administrateur"

J'ai un fichier de commandes qui est dans un répertoire et doit être exécuté à partir de là aussi, car il met à jour les fichiers dans ce répertoire.
Cela fonctionne parfaitement, sauf lorsque l'utilisateur exécute le fichier de commandes en tant qu'administrateur (requis sur Vista). Ensuite, le répertoire de départ est C:\Windows\System32.

Y a-t-il un moyen de savoir quand même à partir de quel répertoire le fichier batch a été exécuté?
Je ne veux pas que l'utilisateur entre le répertoire manuellement.

64
Marc

Essayez d’accéder au chemin des fichiers de commandes comme ceci:

echo %~dp0

Pour plus d'informations, voir la citation suivante de la commande for /? qui décrit le fonctionnement de la commande ci-dessus:

 Vous pouvez maintenant utiliser la syntaxe facultative suivante: 

 % ~ I ​​- développe% I en supprimant les guillemets environnants (") 
% ~ FI - développe% I en un chemin d'accès complet 
% ~ DI - développe% I en une lettre de lecteur uniquement 
% ~ pI - étend% I uniquement à un chemin 
% ~ nI - élargit% I à un nom de fichier uniquement 
% ~ xI - agrandit% I uniquement à une extension de fichier 
% ~ sI - le chemin développé contient des raccourcis noms uniquement 
% ~ aI - étend% I aux attributs de fichier du fichier 
% ~ tI - étend% I à la date/heure du fichier 
% ~ zI - agrandit% I à la taille du fichier 
 % ~ $ PATH: I - recherche dans les répertoires répertoriés dans la variable d'environnement PATH 
 Et étend% I au nom complet 
 Du premier nom trouvé .
 Si le nom de la variable d'environnement n'est pas 
 défini ou si le fichier n’est pas trouvé par la recherche 
, ce modificateur s’étend alors à la chaîne 
 chaîne vide 

 être combinés pour obtenir des résultats composés: 

 % ~ dpI - étend% I à une lettre de lecteur et à un chemin uniquement 
 % ~ nxI - étend% I à un nom de fichier et à une extension uniquement 
 % ~ fsI - développe% I en un nom de chemin complet avec des noms abrégés uniquement 
 % ~ dp $ PATH: I - recherche dans les répertoires listés dans PATH 
 variable d’environnement pour% I et s’étend au 
 lettre de lecteur et chemin du premier trouvé .
 % ~ ftzaI - étend% I à une ligne de sortie semblable à DIR 
89
Martin

Mieux que cd est pushd qui

  • changer la lettre de lecteur si à partir de D:\...
  • assigner une lettre de lecteur si sur un chemin de réseau UNC

Donc, pushd %~dp0 est bon.

Une bonne pratique consiste alors à appeler popd une fois terminé.

38
Benoit

Cela devrait résoudre votre problème en définissant le répertoire de travail du fichier de commandes dans le répertoire actuel:

Incluez ces deux lignes en haut de votre script .bat: 

@setlocal enableextensions
@cd /d "%~dp0"

Trouvé à: http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

25
NMrt

J'utilise:

cd% 0 ..

au début du fichier de commandes pour changer de répertoire en répertoire dans lequel le fichier de commandes a été démarré.

-Mathew

1
Mathew

Vous pouvez CD directement à partir du nom de fichier en ajoutant le parent (non testé dans Windows 8.x, mais fonctionne "pour toujours" pour autant que je me souvienne).

CD %FILENAME%\..

et CD changera également de lecteur en utilisant/D, ce qui est montré ci-dessus mais pas explicitement mentionné, donc peut-être raté . CD/D% FILENAME%\..

(FOR /?IF /?SET /?CALL /?GOTO /?all fournit une lecture très utile si vous utilisez cmd.exe, je les relis de temps en temps. .)

0
Malcolm