计算字符串中char的出现次数(批处理文件)

时间:2015-06-29 17:09:38

标签: batch-file

我需要在Windows中创建一个批处理文件来解析文件夹中可用的所有文件名,并将符合某些条件的文件移动到文件夹中。 我已经使用FOR命令创建了循环周期,并且我已将文件名设置为变量。 现在我需要检查文件名变量中有多少个“ - ”字符;如果此字符的出现次数超过10,则不应移动该文件。此外,我还需要检查文件名中是否有空格:在这种情况下,文件也无法移动。 请:我可以通过哪种方式创建脚本来检查变量中出现的泛滥次数以及是否存在空格字符?

非常感谢

3 个答案:

答案 0 :(得分:1)

此代码仅使用for /f标记生成器来确定是否应复制或排除文件。在hypen的情况下,10 -个字符生成11个令牌,或多或少是排除的原因。在空间的情况下,单个空间生成两个令牌。这是一个简单的部分,但

  • 由于可能存在一个hypen运行,并且for /f标记器仅将连续分隔符作为一个分隔符处理,每个超级用户都用-#替换,文件名前缀为{{1确保正确的分割。

  • 要进行字符串替换,我们需要一个普通变量,而不是#可替换参数。因此,我们需要延迟扩展才能读取已更改变量的内容。但是,由于延迟扩展活动,for字符成为问题,因为解析器将尝试将其解释为变量引用。为避免这种情况,仅在需要时启用延迟扩展并再次禁用。

  • 要处理空格分割,文件名前缀并以!为后缀,以确保正确处理初始或结束空格。

#

另一种方法是过滤文件列表,只检索那些应该处理的文件

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Generate a set of test files
    type nul > "0-1-2-3-4-5-6-7-8-9-10-11-12.testFile"
    type nul > "0-1-2-3-4-5-6-7-8-9-10-11.testFile"
    type nul > "0-1-2-3-4-5-6-7-8-9-10.testFile"
    type nul > "0-1-2-3-4-5-6 -7-8-9-10.testFile"
    type nul > "0-1-2-3-4-5-6-7-8-9.testFile"
    type nul > "-----------.testFile"
    type nul > "----------.testFile"
    type nul > "!-----------!.testFile"
    type nul > "!----------!.testFile"
    type nul > "noSpaces.testFile"
    type nul > "this file has spaces.testFile"

    type nul > "0-1-2-3-4-5!!-6-!!7-8-9-10-11-12.testFile"
    type nul > "0-1-2-3-4-5!!-6-!!7-8-9-10-11.testFile"
    type nul > "0-1-2-3!!-4-5-6-7-8-9!!-10.testFile"
    type nul > "0-1-2-3!!-4-5-6-7-8!-!9.testFile"
    type nul > "no!Sp!aces.testFile"
    type nul > "this !file! has spaces.testFile"


    for %%f in (*) do (
        rem The default behaviour is not to exclude the file
        set "exclude="

        rem Test the hypen conditions
        set "fileName=%%~nf"
        setlocal enabledelayedexpansion
        for /f "tokens=1,11,12 delims=-" %%a in ("#!fileName:-=-#!") do (
            endlocal 
            rem Testing less than 10 hypen
            if "%%~b"=="" set "exclude=1"
            rem Testing more than 10 hypen
            if not "%%~c"=="" set "exclude=1"
        )

        rem Test if the file name contains a space
        for /f "tokens=1,2" %%a in ("#%%~nf#") do if not "%%~b"=="" set "exclude=1" 

        rem Now we know what to do with the file
        if defined exclude (
            echo EXCLUDE "%%~ff"
        ) else (
            echo COPY "%%~ff"
        )
    )

    del /q "*.testFile"

答案 1 :(得分:0)

确定字符串中包含的连字符数的一种简单方法是将原始字符串的长度与删除连字符的字符串长度进行比较:连字符的数量是长度的差异。

1. Save the length of the original string
2. Remove all hyphens from the string
3. Compare the length of the new string to that of the original:
        originalLength - newLength = numberOfHyphens

同样,此方法可用于确定是否存在空格。如果原始字符串的长度大于字符串的长度减去空格,则必须删除一个空格,因此必须存在于原始字符串中。

答案 2 :(得分:0)

如果我正确地理解了你,你真的不想知道一个名字有多少次,但只知道名字是否超过10次 EM>。这可以通过"tokens=12 delims=-"命令的for /F选项轻松实现:

编辑:代码根据评论中声明的新请求进行了相应修改。新代码检查名称​​是否包含10个超时并且不包含空格。

@echo off
setlocal

for %%a in (one-two-three-four-five-six-seven-eight-nine-end.txt
            one-two-three-four-five-six-seven-eight-nine-ten-end.txt
            one-two-three-four-five-six--eight-nine-ten-end.txt
            one-two-three-four-five---eight-nine-ten-end.txt
            one-two-three-four-five----nine-ten-end.txt
            one-two-three-four-five-----ten-end.txt
            one----------end.txt
            ----------.txt
            one-two-three-four-five-six-seven-eight-nine-ten-eleven-end.txt
            "one-two-three-four-five-SIX SEVEN--eight-nine-ten-end.txt") do (
   set "fileName=%%~a"
   call :checkName
)
goto :EOF


:checkName
echo Checking "%fileName%"
set "result=Don't have 10 hypens"
for /F "tokens=11,12 delims=-" %%a in ("%filename:--=X-X-X%") do (
   if "%%a" neq "" if "%%b" equ "" set "result=Name correct"
)
for /F "tokens=2" %%a in ("%fileName%") do if "%%a" neq "" set "result=Include space"
echo %result%
exit /B