2010-06-24 5 views
4

Je dois prendre deux chaînes et les combiner en une seule chaîne de chemin dans un fichier de commandes similaire à la méthode Path.Combine dans .NET. Par exemple, si les chaînes sont "C: \ trunk" et "ProjectName \ Project.txt" ou "C: \ trunk \" et "ProjectName \ Project.txt", le chemin combiné sera "C: \ trunk \ ProjectName". \ Project.txt ".Dans un fichier de commandes, combiner deux chaînes pour créer une chaîne de chemin combinée

J'ai essayé d'utiliser la commande join-path de PowerShell qui fonctionne, mais j'ai besoin d'un moyen de renvoyer cette valeur au fichier batch. J'ai essayé d'utiliser des variables d'environnement pour cela, mais je n'ai pas réussi. Une option pour moi est de déplacer tout ce code dans un script PowerShell et d'éviter complètement le fichier batch. Cependant, si je devais le faire dans le fichier batch, comment le ferais-je?

Répondre

12

Les variables d'environnement que vous définissez dans un sous-processus ne peuvent pas être transmises au processus appelant. L'environnement d'un processus est une copie de son parent, mais pas l'inverse. Cependant, vous pouvez simplement le résultat dans la sortie PowerShell et lire que la sortie du fichier batch:

for /f "delims=" %%x in ('powershell -file foo.ps1') do set joinedpath=%%x 

encore, car les besoins PowerShell environ une seconde pour commencer cela peut ne pas être optimale. Vous pouvez certainement le faire dans un fichier de commandes avec le petit sous-routine suivante:

:joinpath 
set Path1=%~1 
set Path2=%~2 
if {%Path1:~-1,1%}=={\} (set Result=%Path1%%Path2%) else (set Result=%Path1%\%Path2%) 
goto :eof 

Cela ressemble tout simplement à tout le dernier caractère de la première chaîne et si ce n'est pas une barre oblique inverse, il ajoutera un entre les deux - assez simple , réellement.

Exemple de sortie:

JoinPath "C:\trunk" "ProjectName\Project.txt" 
-- C:\trunk\ProjectName\Project.txt 
JoinPath "C:\trunk\" "ProjectName\Project.txt" 
-- C:\trunk\ProjectName\Project.txt 

Le code et le fichier de commandes peut être trouvé in my SVN mais sont reproduites ici car ils sont assez bref de toute façon:

@echo off 
echo JoinPath "C:\trunk" "ProjectName\Project.txt" 
call :joinpath "C:\trunk" "ProjectName\Project.txt" 
echo -- %Result% 

echo JoinPath "C:\trunk\" "ProjectName\Project.txt" 
call :joinpath "C:\trunk\" "ProjectName\Project.txt" 
echo -- %Result% 

goto :eof 

:joinpath 
set Path1=%~1 
set Path2=%~2 
if {%Path1:~-1,1%}=={\} (set Result=%Path1%%Path2%) else (set Result=%Path1%\%Path2%) 
goto :eof 
+0

Que faire si un chemin contient des espaces et cité? Est-ce que vous vous retrouvez avec "c: \ trunk space" \ project.txt au lieu de "c: \ trunk space \ project.txt" –

+1

@Martin: Essayez-le, c'est pourquoi le code est là. Et non, vous ne le faites pas. J'utilise '% ~ 1' et'% ~ 2' dans ce sous-programme qui dépouillera les guillemets autour de l'argument. Bien sûr, vous devez vous citer correctement, mais c'est toujours le cas (par exemple, lorsque vous itérez des fichiers avec 'for'). – Joey

+0

Comment puis-je télécharger votre lot d'échantillons? –

Questions connexes