Как получить путь к пакетной версии script без обратной обратной косой черты в одной команде?

Предположим, что я хочу получить абсолютный путь пакета script из самого пакета script, но без обратной обратной косой черты. Обычно я делаю это так:

SET BuildDir=%~dp0
SET BuildDir=%BuildDir:~0,-1%

Первый оператор получает путь с завершающим обратным слэшем, а вторая строка удаляет последний символ, т.е. обратную косую черту. Есть ли способ объединить эти два оператора в одну строку кода?

Ответ 1

Вместо удаления задней обратной косой черты добавление конечной точки семантически эквивалентно для многих программ.

C:\Windows эквивалентно C:\Windows \.

echo %dp0
>C:\Windows\

echo %dp0.
>C:\Windows\.

Например, robocopy принимает только каталоги без конечных пробелов.

Эти ошибки:

robocopy "C:\myDir" %~dp0 

Это успешно:

robocopy "C:\myDir" %~dp0.

Ответ 2

Только с задержкой расширения, когда вы записываете оба оператора в одну строку:

set BuildDir=%~dp0&&set BuildDir=!BuildDir:~0,-1!

Но этот вид не соответствует цели.

Ответ 3

Я хотел бы указать, что использовать подстрочные трюки для переменных, содержащих пути файловой системы, небезопасно, слишком много символов, таких как!, ^,%, которые являются допустимыми именами папок/файлов, и есть никоим образом не избежать их всех

FOR/D, похоже, лишает конечную обратную косую черту, поэтому вот версия, которая использует для:

setlocal enableextensions enabledelayedexpansion&set _CD=%CD%&cd /D "%~dp0"&(FOR /D %%a IN ("!CD!") DO ((cd /D !_CD!)&endlocal&set "BuildDir=%%~a"))

Для этого требуется Win2000 и, вероятно, сбой, если пакетный файл находится по пути UNC

Ответ 4

Пример script "c:\Temp\test.cmd":

@set BuildDir=%~dp0.
@echo Build directory: "%BuildDir%"

Запустите консоль:

d:\> cmd /C c:\Temp\test.cmd
Build directory: "c:\Temp\."