views:

36

answers:

1

I need to take two strings and combine them into a single path string inside a batch file similar to the Path.Combine method in .Net. For example, whether the strings are "C:\trunk" and "ProjectName\Project.txt" or "C:\trunk\" and "ProjectName\Project.txt", the combined path will be "C:\trunk\ProjectName\Project.txt".

I have tried using Powershell's join-path command which works but I need a way to pass this value back to the batch file. I tried using environment variables for that but I wasn't successful. One option for me is to move all that code into a Powershell script and avoid the batch file altogether. However, if I had to do it within the batch file, how would I do it?

+2  A: 

Environment variables you set in a subprocess cannot be passed to the calling process. A process' environment is a copy of its parent's but not vice versa. However, you can simply output the result in PowerShell and read that output from the batch file:

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

Still, since PowerShell needs about a second to start this may not be optimal. You can certainly do it in a batch file with the following little subroutine:

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

This simply looks at the very last character of the first string and if it's not a backslash it will add one between the two – pretty simple, actually.

Sample output:

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

The code and sample batch file can be found in my SVN.

Joey
What if one path contains spaces and is quoted? Do you end up with "c:\trunk space"\project.txt instead of "c:\trunk space\project.txt"
Martin Beckett
@Martin: Just try it out, that's why the code is there. And no, you don't. I'm using `%~1` and `%~2` in that subroutine which will strip the quotes around the argument. Of course, you need to quote yourself properly, but that's always the case (e.g. when iterating over files with `for`).
Joey