标题: [文件操作] 批处理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- @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=1 delims=!Name!" %%i in ("%%~nxi") do (
- echo %%i
- )
- ;---------------)
- )
- echo;!Name!
-
- pause
复制代码
作者: Batcher 时间: 2021-10-18 22:25
回复 1# hentai87 - @echo off
- 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
- )
- )
- 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
不固定和随机,是指只能有一个下划线,并且结尾是字母加数字这样的格式吗?- @echo off
- for /f "tokens=5 delims=\" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services" ^| findstr "\\[^_]*_[a-z]*[0-9]*$"') do (
- for /f "delims=_" %%j in ("%%i") do (
- echo,%%j
- )
- )
- pause
复制代码
作者: dos大帝 时间: 2021-10-19 11:01
本帖最后由 dos大帝 于 2021-10-19 12:07 编辑
- @echo off & setLocal enableDelayedExpansion
- set "Max=0"
- for /f "tokens=5 delims=\" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
- for /f "tokens=1,2 delims=_" %%j in ("%%i") do (
- set /a _%%k+=1
- if !_%%k! GTR !Max! (
- echo %%j
- )
- )
- )
- 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也会被分开- @echo off
- setlocal enabledelayedexpansion
- set "Max=1"
- 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!
- for /f "tokens=7 delims=\_" %%i in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services"^| findstr "%Name%$"') do (
- echo %%i
- )
- 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!存在与于结果路径中, 就达不到楼主需求- @echo off & setlocal enabledelayedexpansion
-
- for /f "delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
- for /f "tokens=1,2 delims=_" %%j in ("%%~nxi") do (
- rem %%k不能含有空格
- if "%%k" neq "" (
- set /a "_%%k+=1"
-
- if !_%%k! GTR !max_cnt! set max_cnt=!_%%k! & set "max_cnt_str=%%k"
- )
- )
- )
-
- if "!max_cnt_str!" equ "" goto ending
-
- for /f "delims=" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services"') do (
- for /f "tokens=1,2 delims=_" %%j in ("%%~nxi") do (
- if "%%k" equ "%max_cnt_str%" echo %%j
- )
- )
-
- :ending
- endLocal
- 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 |