Board logo

标题: [文件操作] 批处理for语句,delims能用变量吗,变量值是字母数字组合 [打印本页]

作者: hentai87    时间: 2021-10-18 22:06     标题: 批处理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
复制代码

作者: Batcher    时间: 2021-10-18 22:25

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

作者: hentai87    时间: 2021-10-18 22:41

本帖最后由 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
作者: hentai87    时间: 2021-10-18 22:47

本帖最后由 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,等等
这些只是列举,实际情况更多,所以要用变量
作者: idwma    时间: 2021-10-19 01:04

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

作者: dos大帝    时间: 2021-10-19 11:01

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

回复 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
作者: hentai87    时间: 2021-10-19 19: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
作者: hentai87    时间: 2021-10-19 19:42

回复 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
作者: hentai87    时间: 2021-10-19 19:48

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

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

第一第二步已经实现了,就差最后一步
作者: idwma    时间: 2021-10-19 20:40

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

作者: hentai87    时间: 2021-10-19 20:53

回复 11# idwma


    我觉得你理解是对的,但是执行后,结果不对
作者: idwma    时间: 2021-10-19 21:00

回复 12# hentai87


    尴尬改了
作者: dos大帝    时间: 2021-10-20 01:07

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

作者: Fit    时间: 2021-10-21 08:24

for 嵌套中,里面的for可以通过函数调用,形参作为里面for的参数值
作者: aloha20200628    时间: 2021-10-21 19:59

提取尾部仅有一个'_'的字段'xxx_yyy'中的'xxx',代码如下:
@echo off
(for /f "delims=" %%s in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do echo,%%~nxs)>"0.0"
for /f "tokens=1 delims=_" %%1 in ('findstr /R "_[^_]*$" "0.0"') do (echo,%%1)
exit




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2