Удаление последнего символа из переменной в пакетном файле - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь присвоить значение переменной с именем "doNotLog" на основе последнего символа некоторой другой переменной, называемой "choice", через пакетный файл.

Структура выбора переменной:

1) Либо целое число с 1 или более цифрами

2) Или целое число с 1 или более цифрами плюс символ «n» в последней

Цели:

1) Чтобы установить значение «doNotLog» в true, если последний символ «choice» равен n

2) Чтобы окончательно удалить n из «choice»

Пакетный файл, который я использую для достижения этой цели:

@echo off

echo enter choice
set/p choice=
set doNotLog=false

setlocal ENABLEDELAYEDEXPANSION 
if %choice:~-1,1%==n ( 
    set doNotLog=true
    set choice=!choice:n=!
)
endlocal

echo After changes:
echo choice=  %choice%
echo donotLog=  %doNotLog%

@pause

Он производит следующий вывод:

enter choice
54n
After changes:
choice=  54n
donotLog=  false
Press any key to continue . . .

Однако я ожидал следующий вывод:

enter choice
54n
After changes:
choice=  54
donotLog=  true
Press any key to continue . . .

Как мне добиться желаемого результата

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Расширение переменной описано в справочной информации для команды Set. Откройте окно командной строки и введите set /?, чтобы прочитать его.

Вот несколько вспомогательных примеров для вас:

C:\Users\Mohd>Set "Variable=String"

C:\Users\Mohd>Echo(%Variable%
String

C:\Users\Mohd>Echo(%Variable:~0,-1%
Strin

C:\Users\Mohd>Echo(%Variable:~0,1%
tring

C:\Users\Mohd>Echo(%Variable:~0,-2%
Stri

C:\Users\Mohd>Echo(%Variable:~-1,1%
g

C:\Users\Mohd>Echo(%Variable:~1,-1%
trin

C:\Users\Mohd>Echo(%Variable:~1,1%
t

C:\Users\Mohd>Echo(%Variable:~1,2%
tr

C:\Users\Mohd>Echo(%Variable:~1,-2%
tri

C:\Users\Mohd>Echo(%Variable:~2,1%
r

C:\Users\Mohd>Echo(%Variable:~2,-1%
rin

C:\Users\Mohd>Echo(%Variable:~2,-2%
ri

C:\Users\Mohd>Echo(%Variable:~-2,2%
ng

C:\Users\Mohd>Echo(%Variable:~-2,1%
n

C:\Users\Mohd>Echo(%Variable:~2,-1%
rin
1 голос
/ 14 января 2020

Проблема в том, что вы пытались изменить doNotLog и choice внутри setlocal, поэтому вы установили их локально, но глобальные значения остаются неизменными.

Получите их значение внутри setlocal, чтобы получить ожидаемый результат:

@echo off

echo enter choice
set/p choice=
set doNotLog=false

setlocal ENABLEDELAYEDEXPANSION 
if %choice:~-1,1%==n ( 
    set doNotLog=true
    set choice=!choice:n=!
)

echo After changes:
echo choice=  %choice%
echo donotLog=  %doNotLog%

@pause

endlocal

В качестве альтернативы, вы можете перемещать переменные из локального значения, используя маги c из одной строки или сгруппированные в скобках команды и синтаксис classi c %variable%:

endlocal & set "doNotLog=%doNotLog%" & set "choice=%choice%"

... или эквивалентный, но более читаемый ...

(
    endlocal
    set "doNotLog=%doNotLog%"
    set "choice=%choice%"
)

Выше решения могут выглядеть глупо, но они работают ...

Оба из вышеперечисленных будут устанавливать глобальные переменные, потому что они после endlocal, но читают локальные, так как они подставляются перед вычислением линия (или сгруппированная структура) начинается. (Вот почему эти хаки работают с синтаксисом %var%, но не с !var!)

Итак, ваш код может быть изменен на:

@echo off

echo enter choice
set/p choice=
set doNotLog=false

setlocal ENABLEDELAYEDEXPANSION 
if %choice:~-1,1%==n ( 
    set doNotLog=true
    set choice=!choice:n=!
)
(
    endlocal
    set "doNotLog=%doNotLog%"
    set "choice=%choice%"
)

echo After changes:
echo choice=  %choice%
echo donotLog=  %doNotLog%

@pause
0 голосов
/ 15 января 2020


Так что же, без использования SetLocal EnableDelayedExpansion

@echo off 

set "doNotLog=" && set "choice="
for /f ^skip^=^4 %%a in ('echo/ prompt $h^| cmd
')do echo/ && set/p "choice=-%%a Enter choice: "

echo/%choice:~-1%|find /i "n">nul && (
call set "choice=%choice:~0,-1%" && set "doNotLog=true")

if "%doNotLog%" == "" set "doNotLog=false"
echo/ choice = %choice% && echo/ doNotLog = %doNotLog% 
echo/ Press any key to continue... & timeout -1 >nulF

  • выходы для входа 54n и 54 ::
G:\SO_en-EN\Q59738810>Q59738810.cmd

 Enter choice: 54n
 choice = 54
 doNotLog = true
 Press any key to continue...

---------------------------------------

G:\SO_en-EN\Q59738810>Q59738810.cmd

 Enter choice: 54
 choice = 54
 doNotLog = false
 Press any key to continue...


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...