Ars*_*med 5 string join file path batch-file
我需要将两个字符串组合成一个批处理文件中的单个路径字符串,类似于.NET中的Path.Combine方法.例如,无论字符串是"C:\ trunk"和"ProjectName\Project.txt"还是"C:\ trunk \"和"ProjectName\Project.txt",组合路径都将是"C:\ trunk\ProjectName"\Project.txt".
我尝试过使用PowerShell的join-path命令,但是我需要一种方法将这个值传回批处理文件.我尝试使用环境变量,但我没有成功.对我而言,一个选择是将所有代码移动到PowerShell脚本中,并完全避免批处理文件.但是,如果我必须在批处理文件中执行此操作,我该怎么做?
Joe*_*oey 14
您在子进程中设置的环境变量无法传递给调用进程.进程的环境是其父级的副本,但反之亦然.但是,您只需在PowerShell中输出结果并从批处理文件中读取该输出:
for /f "delims=" %%x in ('powershell -file foo.ps1') do set joinedpath=%%x
Run Code Online (Sandbox Code Playgroud)
尽管如此,由于PowerShell需要大约一秒钟才能启动,因此这可能不是最佳选择.您当然可以使用以下小子例程在批处理文件中执行此操作:
:joinpath
set Path1=%~1
set Path2=%~2
if {%Path1:~-1,1%}=={\} (set Result=%Path1%%Path2%) else (set Result=%Path1%\%Path2%)
goto :eof
Run Code Online (Sandbox Code Playgroud)
这只是查看第一个字符串的最后一个字符,如果它不是反斜杠,它将在两者之间添加一个 - 实际上很简单.
样本输出:
JoinPath "C:\trunk" "ProjectName\Project.txt"
-- C:\trunk\ProjectName\Project.txt
JoinPath "C:\trunk\" "ProjectName\Project.txt"
-- C:\trunk\ProjectName\Project.txt
Run Code Online (Sandbox Code Playgroud)
代码和样本批处理文件可以在我的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
Run Code Online (Sandbox Code Playgroud)