Как получить путь к пакетной версии 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\."