【问题标题】:In a batch file, combining two strings to create a combined path string在批处理文件中,组合两个字符串以创建组合路径字符串
【发布时间】:2010-06-24 21:48:35
【问题描述】:

我需要获取两个字符串并将它们组合成一个批处理文件中的单个路径字符串,类似于 .NET 中的 Path.Combine 方法。例如,无论字符串是“C:\trunk”和“ProjectName\Project.txt”还是“C:\trunk\”和“ProjectName\Project.txt”,组合路径将为“C:\trunk\ProjectName” \Project.txt"。

我尝试使用 PowerShell 的 join-path 命令,该命令有效,但我需要一种方法将此值传递回批处理文件。我尝试为此使用环境变量,但没有成功。对我来说,一种选择是将所有代码移动到 PowerShell 脚本中并完全避免使用批处理文件。但是,如果我必须在批处理文件中执行此操作,我将如何执行?

【问题讨论】:

    标签: file join batch-file string path


    【解决方案1】:

    您在子进程中设置的环境变量不能传递给调用进程。进程的环境是其父进程的副本,反之则不然。但是,您可以简单地在 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
    

    代码和示例批处理文件可以在in my 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:试试看,这就是代码存在的原因。不,你没有。我在该子例程中使用%~1%~2,这将去掉参数周围的引号。当然,您需要正确引用自己,但情况总是如此(例如,在使用 for 迭代文件时)。
    • 如何下载您的样品批次?
    • 似乎存在配置问题。稍后我会戳我的主人;现在我已经复制了答案中的代码。它不包含更多内容。
    猜你喜欢
    • 2019-03-12
    • 2018-03-08
    • 2020-12-08
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多