В пакетном файле объединение двух строк для создания объединенной строки пути - PullRequest
5 голосов
/ 25 июня 2010

Мне нужно взять две строки и объединить их в одну строку пути внутри пакетного файла, аналогичного методу Path.Combine в .NET. Например, являются ли строки «C: \ trunk» и «ProjectName \ Project.txt» или «C: \ trunk \» и «ProjectName \ Project.txt», объединенный путь будет «C: \ trunk \ ProjectName \ Project.txt».

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

1 Ответ

14 голосов
/ 25 июня 2010

Переменные среды, которые вы установили в подпроцессе, не могут быть переданы вызывающему процессу.Среда процесса является копией родительской среды, но не наоборот.Однако вы можете просто вывести результат в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...