标题: [注册表类] 【已解决】求助提取出多重嵌套的变量的值 [打印本页]
作者: 9zhmke 时间: 2009-3-17 17:08 标题: 【已解决】求助提取出多重嵌套的变量的值
本帖最后由 pcl_test 于 2017-6-9 08:25 编辑
想制作个从注册表来关掉音量控制里的CD,打开麦克风,为什么不能把char值变成chr!char!里的值?
@echo off
setlocal enabledelayedexpansion
start "" /min sndvol32.exe
set str=0123456789ABCDEF0123456789ABCDEF -"#$--'()*+,-./0123456789:;-=-?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]-_`abcdefghijklmnopqrstuvwxyz{|}~
for /l %%i in (32,1,126) do (
set /a m=%%i/16,n=%%i%%16
call set n=!m!%%str:~!n!,1%%
set chr!n!=!str:~%%i,1!
)
:: 前面一段是把字符库装入变量chr??,以便后面做判断mic字样。已过滤字符:32以前的和!、%、&、<、>
rem 关音量控制的CD,开麦克风选项
set n=0
set count=0
for /f "tokens=8 delims=\" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control" /s^|find /i "音量控制"') do (
echo 声卡是:"%%i"
reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\%%i\音量控制" temp.tmp
)
taskkill /f /im sndvol32.exe >nul 2>nul
for /f "skip=3 tokens=1 delims=\" %%i in ('type temp.tmp') do for %%j in (%%i) do (
if not "%%j"=="00" (
set char=%%j
set n=0x!char!&set /a n=!n! >nul 2>nul
set /p =char=!char!,n=!n!..<nul
if !n! gtr 30 set char=chr!char!&call echo.!char!--&pause
rem 为什么上面这句不能把char值变成chr!char!里的值?
)
)
::....未完工...待加入......................
)
:END
[ 本帖最后由 9zhmke 于 2009-3-18 11:11 编辑 ]
作者: Batcher 时间: 2009-3-17 17:16
能不用&的时候,就别用,以避免不必要的麻烦,分行写不是挺好的么。
作者: 9zhmke 时间: 2009-3-17 17:19
用在那里是被逼的,要判断变量不是0才做后面的操作。
扩展成这样还是不行:
if !n! gtr 30 set char=chr!char!
if !n! gtr 30 call echo.!char!--&pause
[ 本帖最后由 9zhmke 于 2009-3-17 17:20 编辑 ]
作者: Batcher 时间: 2009-3-17 17:22 标题: 回复 3楼 的帖子
我没有仔细看你的代码,不知道你为何要用call,这样行么?- if !n! gtr 30 (
- set char=chr!char!
- echo.!char!--
- pause
- )
复制代码
作者: 9zhmke 时间: 2009-3-17 17:34
char=chr!char!是把char变量变成比如chr65(值为A)之类,变成chr65没问题
call echo !char!只是想显示出chr65这个变量里的内容,比如chr49为1
以前试过用call %%val%%可以脱出变量中的变量,但是不管怎么用!好象都没法脱出来。难道只能使用call :标号来解决了吗?
以上片断可以运行,请版主更正。
[ 本帖最后由 9zhmke 于 2009-3-17 17:40 编辑 ]
作者: Batcher 时间: 2009-3-17 19:41 标题: 回复 5楼 的帖子
既然可以运行了,还更正什么呢?
作者: 9zhmke 时间: 2009-3-18 08:29
原帖由 Batcher 于 2009-3-17 19:41 发表
既然可以运行了,还更正什么呢?
可以运行,但结果是错误的,就象是说“我心爱的女人结婚了,新狼不是我”
说白了就是现在有一个结果在变量char中,大约是chr65,值为"A",不使用!输出时是正确的,可以使用call 语句输出结果,但现场必须使用for,于是就使用了延迟变量,使用了!后,就得不到想要的结果了,怎么可以使用!语句得到我想要的结果呢?
[ 本帖最后由 9zhmke 于 2009-3-18 08:39 编辑 ]
作者: zqz0012005 时间: 2009-3-18 10:40
if !n! gtr 30 set char=chr!char!&call echo.!char!--&pause
改成
if !n! gtr 30 call set char=chr!char!&call echo.%%!char!%%--&pause
作者: 9zhmke 时间: 2009-3-18 11:03
原帖由 zqz0012005 于 2009-3-18 10:40 发表
if !n! gtr 30 set char=chr!char!&call echo.!char!--&pause
改成
if !n! gtr 30 call set char=chr!char!&call echo.%%!char!%%--&pause
还是不行啊?请试试把这代码复制下来调一下,总是调不出chr(xx)里的值来。最多只能显示出char这个变量=chrxx而不能显示出chrxx这个变量里的值
作者: 9zhmke 时间: 2009-3-18 11:08
哈哈,通过zqz0012005的方法变化了一下,出结果了,谢谢几位版主和热心坛友的帮助。谢谢批处理之家、谢谢互联网、CCTV、MTV...
不知道是不是由于for / if层数多的原因?现在改成了:- @echo off
- setlocal enabledelayedexpansion
- start "" /min sndvol32.exe
- set str=0123456789ABCDEF0123456789ABCDEF -"#$--'()*+,-./0123456789:;-=-?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]-_`abcdefghijklmnopqrstuvwxyz{|}~
- for /l %%i in (32,1,126) do (
- set /a m=%%i/16,n=%%i%%16
- call set n=!m!%%str:~!n!,1%%
- set chr!n!=!str:~%%i,1!
- )
- :: 过滤字符:32以前的和!、%、&、<、>
-
- rem 关音量控制的CD,开麦克风选项
- set n=0
- set count=0
- for /f "tokens=8 delims=\" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control" /s^|find /i "音量控制"') do (
- echo 声卡是:"%%i"
- reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\%%i\音量控制" temp.tmp
- )
- taskkill /f /im sndvol32.exe >nul 2>nul
- set chr0=无
- set chr00=无
- for /f "skip=3 tokens=1 delims=\" %%i in ('type temp.tmp') do for %%j in (%%i) do (
- if not "%%j"=="00" (
- set char=%%j
- set n=0x!char!&set /a n=!n! >nul 2>nul
- set /p =char值为"!char!",n值为"!n!"<nul
- set char=chr!char!
- call echo.%%!char!%%--
- pause
- )
- )
-
- ::....未完工...待加入......................
- )
-
- :END
复制代码
[ 本帖最后由 9zhmke 于 2009-3-18 11:12 编辑 ]
作者: 9zhmke 时间: 2009-3-18 14:07
白辛苦一阵,后来发现要改这东西只需简单几句就可以搞定了:
@echo off
setlocal enabledelayedexpansion
start "" /min sndvol32.exe
rem 在音量控制里关闭CD显示,显示麦克风调节
set str=
for /f "tokens=8,9 delims=\]" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control" /s 2^>nul ^|find /i "音" 2^>nul') do set str=%%i& set vol=%%j
if "%str%"=="" echo 在当前计算机但是没能找到声卡.& goto NEXT
set tmp=!str:~0,28!&for /l %%i in (3,1,28) do if "!tmp:~27,1!"=="" set tmp=!tmp!.
taskkill /f /im sndvol32.exe >nul 2>nul
echo 声卡是:"%tmp%."
for /f "tokens=3" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\%str%\%vol%" /v LineStates') do set tmp=%%i
set tmp=!tmp:4000000A69E4B51=0000000A69E4B51!
set tmp=!tmp:000000043004400=400000043004400!
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\%str%\%vol%" /f /v LineStates /t REG_BINARY /d %tmp%
:NEXT
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |