[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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
复制代码

回复 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
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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

TOP

本帖最后由 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,等等
这些只是列举,实际情况更多,所以要用变量

TOP

回复 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
复制代码

TOP

本帖最后由 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里不能用变量
文字说明需求或者修改代码二选一说明, 现在你所说的需求和代码目的都没说清.
先按你之前的描述和代码修改了一遍, 看看符不符合需求

TOP

回复 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

TOP

回复 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

TOP

回复 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

TOP

本帖最后由 hentai87 于 2021-10-19 19:49 编辑

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

第一第二步已经实现了,就差最后一步

TOP

本帖最后由 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
复制代码

TOP

回复 11# idwma


    我觉得你理解是对的,但是执行后,结果不对

TOP

回复 12# hentai87


    尴尬改了
1

评分人数

TOP

本帖最后由 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
复制代码

TOP

for 嵌套中,里面的for可以通过函数调用,形参作为里面for的参数值
Fit Strong

TOP

返回列表