Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在一行中精确计算一个字符-cmd_Batch File_Cmd - Fatal编程技术网

Batch file 在一行中精确计算一个字符-cmd

Batch file 在一行中精确计算一个字符-cmd,batch-file,cmd,Batch File,Cmd,我想写一个批处理文件来计算文本文件每行中特定字符的出现次数 例如,字符串“aa\bb\cc\dd\”中的\计数将为4 find和findstr仅显示包含确切字符的行数。这里有一种方法: @echo off :checkCountOf string countOf [rtnrVar] :: checks count of a substring in a string setlocal EnableDelayedExpansion set "string=aa" set "string=%

我想写一个批处理文件来计算文本文件每行中特定字符的出现次数

例如,字符串
“aa\bb\cc\dd\”
中的
\
计数将为4

find
findstr
仅显示包含确切字符的行数。

这里有一种方法:

 @echo off
:checkCountOf string countOf [rtnrVar]
:: checks count of a substring  in a string 
setlocal EnableDelayedExpansion
set "string=aa"

set "string=%~1"
set "checkCountOf=%~2"

if "%~1" equ "" (
    if "%~3" neq "" (
        endlocal & (
           echo 0
           set "%~3=0"
           exit /b 0
        )
    ) else (
        endlocal & (
           echo 0
           exit /b 0
        )
)


)

if "!checkCountOf!" equ "$" (
    set "string=#%string%#"
    set "string=!string:%checkCountOf%%checkCountOf%=#%checkCountOf%#%checkCountOf%#!"
) else (
    set "string=$%string%$"
    set "string=!string:%checkCountOf%%checkCountOf%=$%checkCountOf%$%checkCountOf%$!"
)


set LF=^


rem ** Two empty lines are required
set /a counter=0


for %%L in ("!LF!") DO (
    for /f "delims=" %%R in ("!checkCountOf!") do ( 
        set "var=!string:%%~R%%~R=%%~L!"
        set "var=!var:%%~R=%%~L!"

        for /f "tokens=* delims=" %%# in ("!var!") do (
            set /a counter=counter+1
        )
    )
)

if !counter! gtr 0 (
    set /a counter=counter-1
)

if "%~3" neq "" (
    endlocal & (
       echo %counter%
       set "%~3=%counter%"
    )
) else (
    endlocal & (
       echo %counter%
    )
)
你可以这样称呼它:

call ::checkCountOf "/aa/b/c/" "/" slashes
echo %slashes%
exit /b %errorlevel% 
无法使用某些特殊字符(
~

您还可以使用替换和回声关闭 SETLOCAL 设置“String=a\b\c\\\\d” 调用:计数“%string%”\ 回显百分比计数% 后藤:EOF :计数 SETLOCAL enabledelayedexpansion 集合/a计数=0 设置“$2=%~1” :cloop 设置“$1=%$2%” 设置“$2=$1:*%2=!" 如果“%$1%”neq“%$2%”集合/a计数+=1,则转到cloop endlocal和SET tally=%tally% 后藤:eof
这里有一种计算字符串中特定字符的方法。它不适用于常见的可疑字符。

未进行广泛测试,但适用于您的示例

@ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\a\b\c\\\\d\\"
set "previous=%string%"
set /a count=0
:loop
set "newstg=%previous:*\=%"
IF NOT "%previous%"=="%newstg%" (
    set /a count+=1
    set "previous=%newstg%"
    IF DEFINED previous goto loop
)
echo %count%
pause
GOTO :eof
这里还有一个选择。我不认为这是防弹的毒药字符

@ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\\a\b\c\\\\d\\"
set i=0
set "x=%string%"
set "x=%x:\=" & set /A i+=1 & set "x=%"
echo %i%

pause

您可以尝试以下脚本,将输入字符串作为(带引号的)命令行参数提供:

set“STRING=%~1$”
set STRING=“%STRING:\=”“%”
设置/A“计数=-1”
对于%%E in(%STRING%)设置/A“计数+=1”
“\`”的回显计数:%Count%
这将替换要由
+空格+
计数的每个字符,并将整个字符串包含在
之间,因此输入字符串
aa\bb\cc\dd\
变为
“aa”“bb”“cc”“dd”“
。生成的字符串被送入
for
循环,该循环识别要迭代的单个项——在本例中为5。计数器变量
COUNT
使用值
-1
初始化,因此结果不是迭代项目的数量,而是分隔符,即原始字符串中存在的
\
字符

如果字符串包含
*
字符,此方法将失败。如果要计数的字符是下列字符之一,
%
=
*
~
,则计数也会失败

@echo off
setlocal

set "string=aa\bb\cc\dd\"

set "count=-1"
for %%a in ("%string:\=" "%") do set /A count+=1

echo %count%
只要字符串不包含通配符,此方法就可以正常工作:
*?
;如果需要,我将使用相同的Npcmaka方法,但编写方式更简单:

@echo off
setlocal EnableDelayedExpansion

set "string=aa\bb\cc\dd\"

set "str=A%string%Z"
set "count=-1"
for /F "delims=" %%a in (^"!str:\^=^"^
% Do NOT remove this line %
^"!^") do (
  set /A count+=1
)
echo %count%

虽然速度慢,但你可以试试这个

@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“inputFile=input.txt”
设置“searchChar=\”
对于/f“delims=”%%a in('
findstr/n“^”“%inputFile%”
“)为/f”delims=:“%%b in(“%%~a”)做什么(
设置“行=%%a”
对于/f%%c英寸('
cmd/u/v/e/q/c“(echo(!line::=!)”^ find/c“%searchChar%”
“)回显行%%b有%%c个字符
)

使用
findstr/n
读取输入文件,以获取文件中带有数字前缀的所有行(用于输出“装饰”,并确保文件中的所有行都已处理)。每行都在管道内处理,从
cmd
find
cmd
实例以unicode输出开始(
/u
)因此,当读取的行被回送时,输出将是每个输入字符的两个字节序列,其中一个是
0x0
ASCII字符。
find
命令将
0
视为行终止符,因此我们将输入行中的每个字符作为一个单独的行。现在,
find
命令计算lin的数量es搜索到的字符发生了。

很遗憾,可能的重复将不会返回“\`”序列的正确结果。哈!非常简单是的。我现在从另一个问题中记住了这个逻辑。不记得是在DosTips上还是在这里。嗨,Antonio。刚刚意识到,如果存在连续字符,您的第二组代码将无法工作。aa\bb\\cc\dd \-这只算4。你应该发布你的第二个解决方案…@Aacini,谢谢。只是忘记了链接。前几天在这个问题上。