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

[注册表类] 【已解决】求助提取出多重嵌套的变量的值

本帖最后由 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 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

白辛苦一阵,后来发现要改这东西只需简单几句就可以搞定了:

@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

TOP

哈哈,通过zqz0012005的方法变化了一下,出结果了,谢谢几位版主和热心坛友的帮助。谢谢批处理之家、谢谢互联网、CCTV、MTV...
不知道是不是由于for / if层数多的原因?现在改成了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. start "" /min sndvol32.exe
  4. set str=0123456789ABCDEF0123456789ABCDEF -"#$--'()*+,-./0123456789:;-=-?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]-_`abcdefghijklmnopqrstuvwxyz{|}~
  5. for /l %%i in (32,1,126) do (
  6.         set /a m=%%i/16,n=%%i%%16
  7.         call set n=!m!%%str:~!n!,1%%
  8.         set chr!n!=!str:~%%i,1!
  9.         )
  10. :: 过滤字符:32以前的和!、%、&、<、>
  11. rem 关音量控制的CD,开麦克风选项
  12. set n=0
  13. set count=0
  14. for /f "tokens=8 delims=\" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control" /s^|find /i "音量控制"') do (
  15.         echo 声卡是:"%%i"
  16.         reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\%%i\音量控制" temp.tmp
  17.         )
  18. taskkill /f /im sndvol32.exe >nul 2>nul
  19. set chr0=无
  20. set chr00=无
  21. for /f "skip=3 tokens=1 delims=\" %%i in ('type temp.tmp') do for %%j in (%%i) do (
  22.         if not "%%j"=="00" (
  23.                 set char=%%j
  24.                 set n=0x!char!&set /a n=!n! >nul 2>nul
  25.                 set /p =char值为"!char!",n值为"!n!"<nul
  26.                 set char=chr!char!
  27.                 call echo.%%!char!%%--
  28.                 pause
  29.                 )
  30.         )
  31. ::....未完工...待加入......................
  32.         )
  33. :END
复制代码

[ 本帖最后由 9zhmke 于 2009-3-18 11:12 编辑 ]

TOP

原帖由 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这个变量里的值

TOP

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
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原帖由 Batcher 于 2009-3-17 19:41 发表

既然可以运行了,还更正什么呢?


可以运行,但结果是错误的,就象是说“我心爱的女人结婚了,新狼不是我”
说白了就是现在有一个结果在变量char中,大约是chr65,值为"A",不使用!输出时是正确的,可以使用call 语句输出结果,但现场必须使用for,于是就使用了延迟变量,使用了!后,就得不到想要的结果了,怎么可以使用!语句得到我想要的结果呢?

[ 本帖最后由 9zhmke 于 2009-3-18 08:39 编辑 ]

TOP

回复 5楼 的帖子

以上片断可以运行,请版主更正。

既然可以运行了,还更正什么呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

char=chr!char!是把char变量变成比如chr65(值为A)之类,变成chr65没问题
call echo !char!只是想显示出chr65这个变量里的内容,比如chr49为1

以前试过用call %%val%%可以脱出变量中的变量,但是不管怎么用!好象都没法脱出来。难道只能使用call :标号来解决了吗?
以上片断可以运行,请版主更正。

[ 本帖最后由 9zhmke 于 2009-3-17 17:40 编辑 ]

TOP

回复 3楼 的帖子

我没有仔细看你的代码,不知道你为何要用call,这样行么?
  1. if !n! gtr 30 (
  2.   set char=chr!char!
  3.   echo.!char!--
  4.   pause
  5. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

用在那里是被逼的,要判断变量不是0才做后面的操作。
扩展成这样还是不行:
  if !n! gtr 30 set char=chr!char!
  if !n! gtr 30 call echo.!char!--&pause

[ 本帖最后由 9zhmke 于 2009-3-17 17:20 编辑 ]

TOP

能不用&的时候,就别用,以避免不必要的麻烦,分行写不是挺好的么。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表