Как получить путь пакетного сценария без завершающей обратной косой черты в одной команде? - PullRequest
29 голосов
/ 01 июля 2010

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

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

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

Ответы [ 4 ]

35 голосов
/ 15 сентября 2014

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

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

echo %dp0
>C:\Windows\

echo %dp0.
>C:\Windows\.

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

Это ошибки:

robocopy "C:\myDir" %~dp0 

Это успешно:

robocopy "C:\myDir" %~dp0.
5 голосов
/ 01 июля 2010

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

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

Но это своего рода не поддается цели.

0 голосов
/ 08 августа 2014

Пример сценария "c: \ Temp \ test.cmd":

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

Запуск в консоли:

d:\> cmd /C c:\Temp\test.cmd
Build directory: "c:\Temp\."
0 голосов
/ 02 июля 2010

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

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-пути

...