Предположим, что я пишу этот пакетный код, чтобы сделать переменнуюПолучение длины переменной в пакете
set var1=test
Теперь как бы я получить длину этой переменной и эхо его?
Предположим, что я пишу этот пакетный код, чтобы сделать переменнуюПолучение длины переменной в пакете
set var1=test
Теперь как бы я получить длину этой переменной и эхо его?
Если вы повторяете переменную в файле и затем получаете длину файла, вы можете вычесть 2 символа из-за невидимых символов.
echo %var1%> length.txt
for %%? in (length.txt) do (set /a length=%%~z? - 2)
Тогда ваша длина должна быть в переменной под названием «длина»
У этого кода есть несколько проблем. Сначала использование '% var1%' не является хорошим. Зачем? Попробуйте код с 'set var1 = 2' или с' set 'var1 = Операторы перенаправления:и >> и | "'. Далее создание файла происходит медленнее, чем все в памяти. Результат также неверен, если текущий рабочий каталог защищен от записи для учетной записи пользователя, используя этот пакетный код, поскольку файл не может быть создан в текущем каталоге. Результат также неверен, если 'length.txt' существует в текущем каталоге, но имеет атрибут только для чтения. – Mofi
Хорошо, спасибо за отзыв! – Woowing
@Wowowing - вы можете использовать '% var%>' с пробелом перед '>', а затем вычесть '3' вместо' 2', чтобы избежать проблемы, вызванной @Mofi – afuna
Вы можете использовать этот код:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "var1=test"
set "Length=0"
if not defined var1 goto OutputLength
:GetLength
if not "!var1:~%Length%,1!" == "" (
set /A Length+=1
goto GetLength
)
:OutputLength
echo Length of variable var1 is: %Length%
endlocal
pause
Для понимания используемых команд и как они работают, открыть окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
goto /?
if /?
pause /?
set /?
setlocal /?
версия Вызов функции
см 1. DosTips length of a string
@echo off
set /p "input=Enter text: "
call :strlen "%input%", len
echo Length is %len%
exit/B
:strlen string len
SetLocal EnableDelayedExpansion
set "token=#%~1" & set "len=0"
for /L %%A in (12,-1,0) do (
set/A "len|=1<<%%A"
for %%B in (!len!) do if "!token:~%%B,1!"=="" set/A "len&=~1<<%%A"
)
EndLocal & set %~2=%len%
exit/B
Macro версия
Я включил версию макроса как, хотя может быть трудно понять, как это работает, действительно, оно ускоряет выполнение, поскольку оно расширяется внутри, не требуется никакого поиска функции.
см 1. Macros with parameters appended 2. How do you get the string length in a batch file?
@echo off
SetLocal DisableDelayedExpansion
call :setupMacros
set /p "input=Enter text: "
%STRLEN% len,input
echo Length is %len%
EndLocal
exit/B
:setupMacros
set ^"LF=^
^" don't remove previous line & rem line feed
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" & rem newline with line continuation
:: macro definition
:: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:: http://www.dostips.com/forum/viewtopic.php?f=3&t=2518
:: get string length
set STRLEN=for %%{ in (1 2) do if %%{==2 (%\n%
for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
set "S=A!%%~2!"^&set "L=0"%\n%
for /L %%A in (12,-1,0) do (set/a "L|=1<<%%A"^&for %%B in (!L!) do if "!S:~%%B,1!"=="" set/a "L&=~1<<%%A")%\n%
for /F "delims=" %%} in ("!L!") do EndLocal^& set "%%1=%%~}"%\n%
)%\n%
) else SetLocal EnableDelayedExpansion ^& set argv=,
exit/B 0
Эти версии нужно всегда 13 операций цикла для обработки до 8192 длины символов строки. Вы можете уменьшить операции цикла для ускорения, но каждый цикл удаляют, сократить на две длины, которые могут быть обработаны (т.е. 12 петли = 4096, 11 петель = 2048, и так далее)
Возможный дубликат [Как вы получаете длину строки в пакетном файле?] (http: // stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file) –