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

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

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

5
задан Peter Mortensen 31 October 2015 в 10:35
поделиться

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
14
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: