[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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
复制代码

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

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

回复 11# idwma


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

TOP

返回列表