0

Batch で入力された文字列の文字数をカウントする必要があります。一時ファイルを使用したくありません。それらなしでそれを行うことができますか?はいの場合、コードの説明をいただければ幸いです。ありがとうございます!

4

2 に答える 2

3

簡単な方法は、関数を使用することです

@echo off
set "myVar=abcdefg"
call :Stringlength result myVar
echo %result%
exit /b

:Stringlength <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

文字列の最大サイズは 8191 バイトなので、これで十分なはずです。
最初のかっこブロックは、パフォーマンスを向上させるためのものです。
2 番目のブロックは%len%、endlocal バリアの背後にある値を返すために必要です。
主なアイデアはバイナリ検索です。最初のループでsは、文字列の一時コピーが 4096 バイトより長いかどうかがテストされます。
次に、次のテストは 2048 または 6144 (=2048+4096) で行われるため、len変数は各ループでもう少し正確になります。
13回ループした後、lenは正確です。

より高速な strlen 関数については、さらにいくつかのトリックを使用する strlen boostedを読むことができます。

バッチ マクロを使用した解決策もあります。通常、マクロはバッチの関数よりもはるかに高速です。

@echo off
call :loadMacros
set "myVar=abcdefg"
%$strlen%  result myVar
echo %result%
exit /b


:loadMacros
set LF=^


::Above 2 blank lines are required - do not remove
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
:::: StrLen pResult pString
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n%
        for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
            set "str=A!%%~2!"%\n%
              set "len=0"%\n%
              for /l %%A in (12,-1,0) do (%\n%
                set /a "len|=1<<%%A"%\n%
                for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n%
              )%\n%
              for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n%
        ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=,

exit /b

dostips.com では、マクロ テクニックについての議論が行われています。
1引数付きのバッチ "マクロ"
2パラメーターが追加されたマクロ

于 2012-05-20T15:51:28.417 に答える
0

関数を呼び出すとき、2番目のパラメーターは参照ではなく値である必要があります。

call :Stringlength result %myVar%
于 2012-05-20T19:48:37.693 に答える