Existe-t-il un moyen dans un script batch Windows de renvoyer un chemin absolu à partir d'une valeur contenant un nom de fichier et / ou un chemin relatif?
Donné:
"..\"
"..\somefile.txt"
J'ai besoin du chemin absolu par rapport au fichier batch.
Exemple:
- "somefile.txt" se trouve dans "C: \ Foo \"
- "test.bat" se trouve dans "C: \ Foo \ Bar".
- L'utilisateur ouvre une fenêtre de commande dans "C: \ Foo" et appelle
Bar\test.bat ..\somefile.txt
- Dans le fichier de commandes "C: \ Foo \ somefile.txt" serait dérivé de
%1
windows
batch-file
relative-path
absolute-path
Nathan Taylor
la source
la source
realpath
pour une normalisation robuste des chemins.SET FilePath=%CD%\%1
pour qu'il ressemble àC:\Foo\Bar\..\..\some\other\dir\file.txt
. Les programmes semblent comprendre un chemin si compliqué.Réponses:
Dans les fichiers batch, comme dans les programmes C standard, l'argument 0 contient le chemin du script en cours d'exécution. Vous pouvez utiliser
%~dp0
pour obtenir uniquement la partie chemin du 0ème argument (qui est le script actuel) - ce chemin est toujours un chemin complet.Vous pouvez également obtenir le chemin complet de votre premier argument en utilisant
%~f1
, mais cela donne un chemin en fonction du répertoire de travail courant, ce qui n'est évidemment pas ce que vous voulez.Personnellement, j'utilise souvent l'
%~dp0%~1
idiome dans mon fichier batch, qui interprète le premier argument par rapport au chemin du batch en cours d'exécution. Il a cependant un inconvénient: il échoue lamentablement si le premier argument est pleinement qualifié.Si vous avez besoin de supporter à la fois des chemins relatifs et absolus, vous pouvez utiliser la solution de Frédéric Ménez : changer temporairement le répertoire de travail courant.
Voici un exemple qui illustrera chacune de ces techniques:
Si vous enregistrez ceci sous c: \ temp \ example.bat et que vous l'exécutez à partir de c: \ Users \ Public sous
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... vous observerez la sortie suivante:
la documentation de l'ensemble des modificateurs autorisés sur un argument batch peut être trouvée ici: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
la source
%0
et de%1
même:%~dpnx0
pour le chemin complet + nom du fichier batch lui-même,%~dpnx1
pour le chemin complet + nom de son premier argument [si c'est un nom de fichier du tout]. (Mais commentd:\foo\..\bar\xyz.txt
peut toujours être normalisé. Je recommande d'utiliser cette approche avec la réponse de @ axel-heider ci-dessous (en utilisant un sous-programme batch - alors vous pouvez le faire sur n'importe quelle variable, pas seulement une variable numérotée).Je suis tombé sur un besoin similaire ce matin: comment convertir un chemin relatif en chemin absolu à l'intérieur d'un script de commande Windows.
Ce qui suit a fait l'affaire:
la source
pushd .
évite ce problème.La plupart de ces réponses semblent folles sur compliquées et super boguées, voici la mienne - cela fonctionne sur n'importe quelle variable d'environnement, non
%CD%
ouPUSHD
/POPD
oufor /f
absurde - juste de vieilles fonctions batch. - Le répertoire et le fichier ne doivent même pas exister.la source
%~f1
une abréviation de%~dpfn1
- alors, n'hésitez pas à utiliser à la%~f1
place. 🙂 - dans le format long~
signifie supprimer les guillemets,d
signifie lecteur,p
signifie chemin,n
seul serait un nom de fichier sans extension, maisfn
signifie un nom de fichier avec une extension. le1
signifie le premier argument. - (Je crois que ce format est antérieur à Windows 7.)Sans avoir à avoir un autre fichier batch auquel passer des arguments (et utiliser les opérateurs d'argument), vous pouvez utiliser
FOR /F
:où
i
in%%~fi
est la variable définie à/F %%i
. par exemple. si vous changiez cela en/F %%a
alors la dernière partie serait%%~fa
.Pour faire la même chose directement à l'invite de commande (et non dans un fichier batch), remplacez
%%
par%
...la source
cd
commande ne change pas nécessairement la%CD%
variable d'environnement (si par exemple vous êtes sur le lecteurD:
et que votre chemin cible estC:
cd /D D:\on.other.drive
FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fi
échouera si le..\relativePath
contient des espacesfor /?
suggère d'utiliser des lettres majuscules pour les noms de variables, pour éviter toute confusion avec les paramètres de substitution/F
ne fonctionnera pas sur les chemins qui n'existent pas et résoudra les caractères génériques. Si vous voulez cela, super, mais si vous voulez la fonctionnalité de/F
, il vous suffit d'utiliser letokens
mot clé:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
C'est pour aider à combler les lacunes de la réponse d'Adrien Plisson (qui devrait être votée pour dès qu'il la modifie ;-):
On peut gérer
%0
et de%1
même:%~dpnx0
pour lecteur complet + chemin + nom + extension du fichier batch lui-même, cela%~f0
suffit également;%~dpnx1
pour lecteur complet + chemin + nom + extension de son premier argument [si c'est un nom de fichier du tout], cela%~f1
suffit également;%~f1
fonctionnera indépendamment de la manière dont vous avez spécifié votre premier argument: avec des chemins relatifs ou avec des chemins absolus (si vous ne spécifiez pas l'extension du fichier lors du nommage%1
, il ne sera pas ajouté, même si vous utilisez%~dpnx1
- cependant.Mais comment diable nommeriez-vous un fichier sur un lecteur différent de toute façon si vous ne donniez pas ces informations de chemin complet sur la ligne de commande en premier lieu?
Cependant,
%~p0
,%~n0
,%~nx0
et%~x0
peut être utile, si vous êtes intéressé par chemin (sans driveletter), nom de fichier (sans extension), nom complet avec l' extension ou l'extension de nom de fichier uniquement. Mais notez que tandis que%~p1
et%~n1
fonctionnera pour trouver le chemin ou le nom du premier argument,%~nx1
et%~x1
n'ajoutera pas + afficher l'extension, sauf si vous l'avez déjà utilisé sur la ligne de commande.la source
%~dpnx1
est qu'il donne le chemin complet de l'argument par rapport au répertoire courant , tandis que l'OP veut le chemin relatif au répertoire où réside le fichier de commandes .%~dpnx1
donne le chemin complet du 1er argument. Pas du tout relatif , et pas non plus relatif au répertoire actuel. Led
est pour le lecteur, lep
est pour le chemin, len
est pour le nom de fichier sans suffixe, lex
est pour le suffixe, le1
est pour le premier argument. - Et la question de Nathan était: "Est-il possible de renvoyer un chemin absolu à partir d'une valeur contenant un nom de fichier et / ou un chemin relatif?"Vous pouvez également utiliser les fonctions batch pour cela:
la source
Petite amélioration de l'excellente solution de BrainSlugs83 . Généralisé pour permettre de nommer la variable d'environnement de sortie dans l'appel.
Si exécuter à partir de la
C:\project
sortie est:la source
Je n'ai pas vu beaucoup de solutions à ce problème. Certaines solutions utilisent la traversée de répertoires à l'aide de CD et d'autres utilisent des fonctions de traitement par lots. Ma préférence personnelle a été pour les fonctions batch et en particulier, la fonction MakeAbsolute fournie par DosTips.
La fonction présente de réels avantages, principalement qu'elle ne modifie pas votre répertoire de travail actuel et d'autre part que les chemins en cours d'évaluation ne doivent même pas exister. Vous trouverez quelques conseils utiles sur la façon d'utiliser la fonction ici aussi.
Voici un exemple de script et ses sorties:
Et la sortie:
J'espère que cela aide ... Cela m'a certainement aidé :) PS Merci encore à DosTips! Tu gères!
la source
Vous pouvez simplement les concaténer.
cela semble étrange avec \ .. \ au milieu de votre chemin mais cela fonctionne. Pas besoin de faire quoi que ce soit de fou :)
la source
echo %~dp0..\SomeFile.txt
Dans votre exemple, à partir de Bar \ test.bat, DIR / B / S .. \ somefile.txt renverrait le chemin complet.
la source
PowerShell est assez courant ces jours-ci, donc je l'utilise souvent comme moyen rapide d'appeler C # car il a des fonctions pour à peu près tout:
C'est un peu lent, mais la fonctionnalité gagnée est difficile à battre à moins de recourir à un langage de script réel.
la source
La solution de stijn fonctionne avec les sous-dossiers sous
C:\Program Files (86)\
,la source
Fichiers Voir toutes les autres réponses
Répertoires
En
..
étant votre chemin relatif, et en supposant que vous êtes actuellement dansD:\Projects\EditorProject
:cd .. & cd & cd EditorProject
(le chemin relatif)renvoie le chemin absolu, par exemple
D:\Projects
la source
la source