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