在子进程中设置的环境变量无法传递到调用进程。进程的环境变量是其父进程的副本,但反之不成立。然而,您可以在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
%~1
和%~2
来去除参数周围的引号。当然,你需要正确地引用自己,但这总是必须的(例如,在使用for
迭代文件时)。 - Joey