用蝙蝠计算文件名中的下划线

我到处search了这个地方,但是我没有find它,所以我想要做的事情很简单,我想计算一个文件名中的下划线,并把它放在一个variables中,以便以后使用它。

有没有简单的批处理代码来做到这一点?

@echo off setlocal enabledelayedexpansion set filename=__example_file.bin_ set cnt=0 set pos=0 :loop if "!filename:~%pos%,1!"=="_" set /a cnt=%cnt%+1 set /a pos=%pos%+1 if not "!filename:~%pos%,1!"=="" goto loop echo Count: %cnt% 

该代码是非常丑陋的,但我目前找不到更好的方法。

计算下划线的不同方法(或者用下划线分隔的更精确的元素)
是使用自扩展代码 :

 :: Q:\Test\2017\08\28\SO_45917406.cmd @echo off & setlocal enabledelayedexpansion set "FileName=example_file_name_20170828_181000.txt" Set i=1&Set "FileName[!i!]=%FileName:_="&Set /a i+=1&Set "FileName[!i!]=%" Echo Counted %i% underscore separated elements Set FileName 

示例输出:

 > Q:\Test\2017\08\28\SO_45917406.cmd Counted 5 underscore separated elements FileName=example_file_name_20170828_181000.txt FileName[1]=example FileName[2]=file FileName[3]=name FileName[4]=20170828 FileName[5]=181000.txt 

这个解决方案来自@xmcp:

 @echo off Rem The srting to count in the filename is the underscrore "_" Rem we can of course set another one ;) set "MyString=_" setlocal enabledelayedexpansion @for /f "delims=" %%a in ('Dir /b "%userprofile%\Desktop"') do ( set "filename=%%a" set /a "cnt=0" set /a "pos=0" Call:Counting_String "!filename!" "%Mystring%" ) pause & exit ::********************************************************* :Counting_String <filename> <MyString> set "filename=%~1" set "string=%~2" if /I "!filename:~%pos%,1!"=="%Mystring%" set /a cnt+=1 set /a pos+=1 if not "!filename:~%pos%,1!"=="" goto Counting_String echo !filename!: [!cnt!] "%Mystring%" exit /b ::*********************************************************