У меня много проблем с выяснением, почему мой .bat-файл случайно закрывается ... но я сузил его до следующего:

IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%

В идеале я в конечном итоге пытаюсь удалить все начальные или конечные косые черты или обратные косые черты из %var%, которые устанавливаются пользователем.

Вышеупомянутые строки работают, но не внутри оператора IF, когда setlocal EnableDelayedExpansion установлен И когда переменная также установлена ​​внутри оператора IF.

Например, если я удалю приведенные выше строки, будет работать следующее, но в противном случае произойдет сбой:

@echo off
setlocal EnableDelayedExpansion
set somevar=blah
if !somevar!==blah (
    set /p var="-> "
    IF %var:~-1%==\ SET var=%var:~0,-1%
    IF %var:~0,1%==\ SET var=%var:~1%
    echo !var!
)
pause

Однако, если я удалю условие IF, оно сработает:

@echo off
setlocal EnableDelayedExpansion
set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!
pause

И если я сохраню оператор IF, но вынесу set /p var="-> " за его пределы, то он также будет работать:

@echo off
setlocal EnableDelayedExpansion
set somevar=blah
set /p var="-> "
if !somevar!==blah (
    IF %var:~-1%==\ SET var=%var:~0,-1%
    IF %var:~0,1%==\ SET var=%var:~1%
    echo !var!
)
pause

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

И если есть более эффективный способ выполнить то, что я описал, во что бы то ни стало, пожалуйста, упомяните об этом. Я новичок в пакетном написании.

0
Shoelaced 18 Фев 2018 в 05:53

1 ответ

Лучший ответ

Как вы предположили, ключом к решению вашей проблемы является использование delayed expansion.

Когда был вызван delayedexpansion,

%var% относится к значению var, как это было, когда была встречена последовательность инструкций в скобках (на самом деле var просто заменяется на его значение на тот момент , а затем инструкции выполняются)

!var! относится к значению времени выполнения var, то есть к значению в текущий момент времени, которое, возможно, было изменено операцией code block .

Итак, изучая ваш код

set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!

Это выполняется как

set /p var="-> "
IF ==\ SET var=
IF ==\ SET var=
echo !var!

Поскольку значение var в начале кода ничего , следовательно, он "вылетает" из-за неправильного синтаксиса оператора if.

Чтобы решить проблему, используйте

set /p var="-> "
IF !var:~-1!==\ SET var=!var:~0,-1!
IF !var:~0,1!==\ SET var=!var:~1!
echo !var!

Где каждая ссылка на var становится значением , измененным операцией "set / p" или последующими операциями set.

Однако set/p не очищает переменную, если вы просто нажимаете Enter . Он оставляет переменную неизменной (но в то время ее значение оказывается ничем )

Следовательно, лучший подход -

set /p var="-> "
IF "!var:~-1!"=="\" SET "var=!var:~0,-1!"
IF "!var:~0,1!"=="\" SET "var=!var:~1!"
echo !var!

Где кавычки вокруг аргументов if гарантируют, что аргументы не являются пустыми , а кавычки вокруг аргументов set гарантируют, что переменная не получит случайных конечных пробелов, которые могут существовать на строка инструкции.

1
Magoo 18 Фев 2018 в 06:38