在批处理文件中,将两个字符串组合成一个路径字符串。

5
我需要将两个字符串合并成一个路径字符串,类似于.NET中的Path.Combine方法,在批处理文件中实现。例如,无论这些字符串是“C:\trunk”和“ProjectName\Project.txt”还是“C:\trunk\”和“ProjectName\Project.txt”,合并后的路径都将是“C:\trunk\ProjectName\Project.txt”。
我尝试使用PowerShell的join-path命令,它可以工作,但我需要一种将此值传回批处理文件的方法。我尝试使用环境变量,但没有成功。对我来说,一个选择是将所有代码移动到PowerShell脚本中,并完全避免使用批处理文件。然而,如果必须在批处理文件中完成它,我该怎么做呢?
1个回答

15

在子进程中设置的环境变量无法传递到调用进程。进程的环境变量是其父进程的副本,但反之不成立。然而,您可以在PowerShell中输出结果,并从批处理文件中读取该输出:

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

然而,由于PowerShell需要约一秒钟的时间来启动,因此这可能不是最优的。您可以使用以下小子程序在批处理文件中执行:

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

这只是简单地查看第一个字符串的最后一个字符,如果它不是反斜杠,则会在两个字符串之间添加一个反斜杠 - 实际上非常简单。

示例输出:

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

你可以在我的SVN上找到代码和示例批处理文件,但由于它们本身非常简短,所以我在这里复制了一份:

@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

如果一个路径包含空格并被引用,会怎样呢?你最终会得到"c:\trunk space"\project.txt而不是"c:\trunk space\project.txt"。 - Martin Beckett
1
@Martin:试一下就知道了,这就是为什么代码在那里的原因。不,你不需要。我在子程序中使用%~1%~2来去除参数周围的引号。当然,你需要正确地引用自己,但这总是必须的(例如,在使用for迭代文件时)。 - Joey
我如何下载你们的样本批处理文件? - kiss my armpit
似乎存在配置问题。我稍后会联系我的托管方;现在我已经复制了答案中的代码。它并没有包含更多内容。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接