Запретить пакетным модификаторам опускать каретку, если она находится в имени файла - PullRequest
2 голосов
/ 11 июля 2020

У меня есть сценарий bat, и первый переданный аргумент: "C:\aaa^bbb\xxx^yyy.txt"

I wi sh, чтобы получить файл и содержащий dir (head):

set winhead=%~dp1
set winfile=%~nx1
echo winhead: %winhead%
echo winfile: %winfile%

Печатает

winhead: 'C:\aaabbb\'
winfile: 'xxxyyy.txt'

Я вижу вставки ^ там, где они упали. Хорошо, я просто уйду от них:

set Pathin=%1
set Pathin=%Pathin:^=^^%
echo Pathin: %Pathin%

Печать

Pathin: "C:\aaa^^bbb\xxx^^yyy.txt"

Теперь, чтобы извлечь имя файла и заголовок:

set winhead=%~dpPathin%
set winfile=%~nxPathin%

или

set winhead=%~dpPathin
set winfile=%~nxPathin

Не выполняет модификатор, а просто возвращает буквальную строку. После некоторого исследования я обнаружил, что модификаторы могут использоваться только с аргументами, т.е. в данном случае %1.

Так это ошибка, что модификаторы не обрабатывают символы вставки правильно? Как извлечь части полного пути для файлов, которые можно было создать в проводнике (то есть тех, которые содержат символы вставки)?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Акцент ^ Circumflex (так называемый каретка ) работает как escape-символ . Если вам нужно поместить курсор в переменную буквально, экранируйте его, используя двойные кавычки (set "winhead=%~dp1") и используйте либо двойные кавычки (echo "%winhead%"), либо отложенное раскрытие (echo !winhead!).

Пример сценария:

@ECHO OFF
echo supplied parameters: %*
SETLOCAL EnableExtensions DisableDelayedExpansion
set "winhead=%~dp1"
set "winfile=%~nx1"
echo winhead - percent expansion: %winhead% "%winhead%" 
echo winfile - percent expansion: %winfile% "%winfile%"
SETLOCAL EnableDelayedExpansion
  echo winhead - delayed expansion: !winhead! "!winhead!"
  echo winfile - delayed expansion: !winfile! "!winfile!"
ENDLOCAL

Вывод : .\SO\62849275.bat "C:\aaa^bbb\xxx^yyy.txt"

supplied parameters: "C:\aaa^bbb\xxx^yyy.txt"
winhead - percent expansion: C:\aaabbb\ "C:\aaa^bbb\"
winfile - percent expansion: xxxyyy.txt "xxx^yyy.txt"
winhead - delayed expansion: C:\aaa^bbb\ "C:\aaa^bbb\"
winfile - delayed expansion: xxx^yyy.txt "xxx^yyy.txt"

Вы можете избежать символа вставки с помощью дополнительной вставки ("C:\aaa^^bbb\xxx^^yyy.txt") или использовать команду call поведение: Если команда CALL содержит символ вставки внутри строки в кавычках, символы вставки будут быть удвоенным :

CALL .\SO\62849275.bat "C:\aaa^bbb\xxx^yyy.txt"
supplied parameters: "C:\aaa^^bbb\xxx^^yyy.txt"
winhead - percent expansion: C:\aaa^bbb\ "C:\aaa^^bbb\"
winfile - percent expansion: xxx^yyy.txt "xxx^^yyy.txt"
winhead - delayed expansion: C:\aaa^^bbb\ "C:\aaa^^bbb\"
winfile - delayed expansion: xxx^^yyy.txt "xxx^^yyy.txt"

Боковое примечание . Символ ^ (Circumflex Accent, U + 005E) используется для вызова каретки из-за его визуального сходства с символом (Caret, U + 2038).

2 голосов
/ 11 июля 2020

Если вы можете изменить свой ввод, то передайте "C:\aaa^^^bbb\xxx^^^yyy.txt" со следующим:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "winhead=%~dp1"
Set "winfile=%~nx1"
Echo winhead: %winhead%
Echo winfile: %winfile%

Pause

Если вы не можете изменить ввод, используйте "C:\aaa^bbb\xxx^yyy.txt" и включите отложенное расширение:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "winhead=%~dp1"
Set "winfile=%~nx1"

SetLocal EnableDelayedExpansion
Echo winhead: !winhead!
Echo winfile: !winfile!
EndLocal

Pause
...