找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 57181|回复: 15

[文件操作] 批处理for语句,delims能用变量吗,变量值是字母数字组合

[复制链接]
发表于 2021-10-18 22:06:01 | 显示全部楼层 |阅读模式
本帖最后由 hentai87 于 2021-10-18 22:51 编辑

目标
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BluetoothUser1_bca54
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BluetoothUser2_bca54
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BluetoothUserService_123
想要的结果
BluetoothUser1
BluetoothUser2
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "Max=0"
  4. for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
  5.         for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
  6.                 set /a _%%k+=1
  7.                 if !_%%k! GTR !Max! set "Name=%%k"
  8.                 )
  9. ;有问题的部分,我自己写的不对,主要想表达意思--------(
  10.         for /f "tokens=1 delims=!Name!" %%i in ("%%~nxi") do (
  11.                 echo %%i
  12.                 )
  13. ;---------------)
  14.         )
  15. echo;!Name!

  16. pause
复制代码
发表于 2021-10-18 22:25:17 | 显示全部楼层
回复 1# hentai87
  1. @echo off
  2. for /f "tokens=5 delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services" ^| findstr "BluetoothUser[0-9]"') do (
  3.     for /f "delims=_" %%j in ("%%i") do (
  4.         echo,%%j
  5.     )
  6. )
  7. pause
复制代码
 楼主| 发表于 2021-10-18 22:41:12 | 显示全部楼层
本帖最后由 hentai87 于 2021-10-18 22:58 编辑

回复 2# Batcher


BluetoothUser不是固定值,是任意,1和2不是规律
你的我加进去后,运行了很久,最后没有echo出值

@echo off
setlocal enabledelayedexpansion
set "Max=0"
for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
        for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
                set /a _%%k+=1
                if !_%%k! GTR !Max! set "Name=%%k"
                )
        for /f "tokens=5 delims=\" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services" ^| findstr "BluetoothUser[0-9]"') do (
                    for /f "delims=_" %%j in ("%%i") do (
                                echo,%%j
                            )
                )
        )
echo;!Name!

pause
 楼主| 发表于 2021-10-18 22:47:04 | 显示全部楼层
本帖最后由 hentai87 于 2021-10-18 22:49 编辑

回复 2# Batcher


还是要用!Name!的,不是简单的固定值,
例如
BluetoothUserService_bca54
CaptureService_bca54
camsvc
clr_optimization_v4.0.30319_32

bca54是随机数值,规律就是会出现在_后面,并且数量最多
前面代码,已经得出了!Name!,即bca54
后面要筛选!Name!前面的部分,即BluetoothUserService,CaptureService等等
想要的结果是CaptureService和BluetoothUserService,等等
这些只是列举,实际情况更多,所以要用变量
发表于 2021-10-19 01:04:10 | 显示全部楼层
回复 4# hentai87

不固定和随机,是指只能有一个下划线,并且结尾是字母加数字这样的格式吗?
  1. @echo off
  2. for /f "tokens=5 delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services" ^| findstr "\\[^_]*_[a-z]*[0-9]*$"') do (
  3.     for /f "delims=_" %%j in ("%%i") do (
  4.         echo,%%j
  5.     )
  6. )
  7. pause
复制代码
发表于 2021-10-19 11:01:06 | 显示全部楼层
本帖最后由 dos大帝 于 2021-10-19 12:07 编辑
  1. @echo off & setLocal enableDelayedExpansion
  2. set "Max=0"
  3. for /f "tokens=5 delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
  4.     for /f "tokens=1,2 delims=_" %%j in ("%%i") do (
  5.         set /a _%%k+=1
  6.         if !_%%k! GTR !Max! (
  7.             echo %%j
  8.         )
  9.     )
  10. )
  11. pause
复制代码
delims里不能用变量
文字说明需求或者修改代码二选一说明, 现在你所说的需求和代码目的都没说清.
先按你之前的描述和代码修改了一遍, 看看符不符合需求
 楼主| 发表于 2021-10-19 19:42:33 | 显示全部楼层
回复 6# dos大帝
简单来说就是想获得这段代码所获得的值的前面部分
BluetoothUserService_bca54
CaptureService_bca54
camsvc
clr_optimization_v4.0.30319_32
用以下代码获得bca54了,但是想要前面的部分,同时不想要不含bca54的那些值
就是想筛选出含有bca54,但是bca54是不确定的
bca54规律也说了,就是带有_,并且后面的值出现次数最多


@echo off
    setlocal enabledelayedexpansion
    set "Max=0"
    for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
            for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
                    set /a _%%k+=1
                    if !_%%k! GTR !Max! set "Name=%%k"
                    )
            )
    echo;!Name!
pause
 楼主| 发表于 2021-10-19 19:42:42 | 显示全部楼层
回复 5# idwma


    简单来说就是想获得这段代码所获得的值的前面部分
BluetoothUserService_bca54
CaptureService_bca54
camsvc
clr_optimization_v4.0.30319_32
用以下代码获得bca54了,但是想要前面的部分,同时不想要不含bca54的那些值
就是想筛选出含有bca54,但是bca54是不确定的
bca54规律也说了,就是带有_,并且后面的值出现次数最多


@echo off
    setlocal enabledelayedexpansion
    set "Max=0"
    for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
            for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
                    set /a _%%k+=1
                    if !_%%k! GTR !Max! set "Name=%%k"
                    )
            )
    echo;!Name!
pause
 楼主| 发表于 2021-10-19 19:42:54 | 显示全部楼层
回复 2# Batcher


    简单来说就是想获得这段代码所获得的值的前面部分
BluetoothUserService_bca54
CaptureService_bca54
camsvc
clr_optimization_v4.0.30319_32
用以下代码获得bca54了,但是想要前面的部分,同时不想要不含bca54的那些值
就是想筛选出含有bca54,但是bca54是不确定的
bca54规律也说了,就是带有_,并且后面的值出现次数最多


@echo off
    setlocal enabledelayedexpansion
    set "Max=0"
    for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
            for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
                    set /a _%%k+=1
                    if !_%%k! GTR !Max! set "Name=%%k"
                    )
            )
    echo;!Name!
pause
 楼主| 发表于 2021-10-19 19:48:38 | 显示全部楼层
本帖最后由 hentai87 于 2021-10-19 19:49 编辑

虽然看起来很复杂说不清,但是是很简单的一个筛选呀,感觉很难实现的样子
就是筛选含有“_的值“
然后统计“_后面部分的值“出现次数并筛选出重复次数最多的那个值
然后列出含有那个值的“_前面部分的值“

第一第二步已经实现了,就差最后一步
发表于 2021-10-19 20:40:24 | 显示全部楼层
本帖最后由 idwma 于 2021-10-19 21:00 编辑

回复 10# hentai87
delims能用变量,是按单个字符来分隔的
像1a2b3_abc如用abc当分隔符
1a2b3这里的123也会被分开
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "Max=1"
  4. for /f "delims=" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"') do (
  5.         for /f "tokens=2 delims=_" %%k in ("%%~nxi") do (
  6.                 set /a _%%k+=1
  7.                 if !_%%k! GTR !Max! set "Name=%%k"
  8.                 )
  9.         )
  10. echo;!Name!
  11. for /f "tokens=7 delims=\_" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"^| findstr "%Name%$"') do (
  12. echo %%i
  13. )
  14. pause
复制代码
 楼主| 发表于 2021-10-19 20:53:56 | 显示全部楼层
回复 11# idwma


    我觉得你理解是对的,但是执行后,结果不对
发表于 2021-10-19 21:00:29 | 显示全部楼层
回复 12# hentai87


    尴尬改了

评分

参与人数 1技术 +1 收起 理由
hentai87 + 1 乐于助人

查看全部评分

发表于 2021-10-20 01:07:20 | 显示全部楼层
本帖最后由 dos大帝 于 2021-10-20 01:17 编辑

回复 10# hentai87


1. delims里不能使用变量, 比如你举例的!Name!;11楼举例的a,b,c等是字符, 不是变量
2. 11楼代码找的是 reg query "HKLM\SYSTEM\CurrentControlSet\Services" 结果中出现至少两次, 且最后出现的值, 而不是需求中出现次数最多的值, 同时如果结果中都没有"_"或相同的"_值"少于两次, 那么结果全部都会打印;
    第11行代码中, 如果找到的!Name!存在与于结果路径中, 就达不到楼主需求
  1. @echo off & setlocal enabledelayedexpansion

  2. for /f "delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
  3.     for /f "tokens=1,2 delims=_" %%j in ("%%~nxi") do (
  4.             rem %%k不能含有空格
  5.         if "%%k" neq "" (
  6.                 set /a "_%%k+=1"

  7.                 if !_%%k! GTR !max_cnt! set max_cnt=!_%%k! & set "max_cnt_str=%%k"
  8.         )
  9.     )
  10. )

  11. if "!max_cnt_str!" equ "" goto ending

  12. for /f "delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
  13.     for /f "tokens=1,2 delims=_" %%j in ("%%~nxi") do (
  14.         if "%%k" equ "%max_cnt_str%" echo %%j
  15.     )
  16. )

  17. :ending
  18. endLocal
  19. pause
复制代码
发表于 2021-10-21 08:24:07 | 显示全部楼层
for 嵌套中,里面的for可以通过函数调用,形参作为里面for的参数值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 01:39 , Processed in 0.031573 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表