В пакетном файле, объединяя две строки, чтобы создать объединенную строку пути


Мне нужно взять две строки и объединить их в одну строку пути внутри пакетного файла, аналогичного пути.Комбинируйте метод in. NET. например, являются ли строки "C:trunk" и "Имяпроектапроекта.txt " или "C:trunk" и " имя проекта Project.txt", комбинированный путь будет "C:trunkProjectNameProject.формат txt".

Я пробовал использовать команду join-path PowerShell, которая работает, но мне нужен способ передать это значение обратно в пакетный файл. Я попробовал использовать переменные окружения за это, но мне это не удалось. Один из вариантов для меня-переместить весь этот код в сценарий PowerShell и полностью избежать пакетного файла. Однако, если бы мне пришлось сделать это в пакетном файле, как бы я это сделал?

1 4

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

Код и пример пакетного файла можно найти в моем 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