标题: [文本处理] 【已解决】批处理如何把变量中的%字符替换掉? [打印本页]
作者: gudou 时间: 2017-4-14 10:05 标题: 【已解决】批处理如何把变量中的%字符替换掉?
set abc=%%123%%456
(原来上面代码错写成:set abc=%123%456,不过后面的大神都看懂了……惭愧)
变量abc中文本内容是:%123%456,并且%字符的位置和数量无规律,即不用%abc:~1,3%%abc:~-3,3%来屏蔽,用如果把其中的%屏蔽呢?
用了
%abc:%=%
%abc:%%=%
%abc:^%=%
都不行……
作者: ShowCode 时间: 2017-4-14 10:10
其实 set 之后变量的值已经不是希望的样子了,可以这样观察一下:- set abc=%123%456
- echo %abc%
- pause
复制代码
作者: gudou 时间: 2017-4-14 10:10
除了用
for /f "tokens=1,2,3,4,5 delims=%" %a in ("%abc%") do echo %a%b%c%d%e
这样的“方法”外还有更精准的方法吗?
即,还是想用 %abc:str1=str2% 类的替换法……
作者: happy886rr 时间: 2017-4-14 10:18
批处理不支持%号替换,直接就扩展了- @echo off
- set "abc=%%123%%456"
- echo %abc%
- pause
复制代码
作者: gudou 时间: 2017-4-14 11:08
回复 2# ShowCode
什么意思?%abc%还是 “%123%456” 没问题啊
作者: gudou 时间: 2017-4-14 11:08
回复 4# happy886rr
无法替换啊……我是用来提取注册表中数据的,必须这样操作,不能直接
作者: 老刘1号 时间: 2017-4-14 12:07
- setlocal ENABLEDELAYEDEXPANSION
- set "a=1%%2%%3%%%%456%%"
- echo !a:%%=!
- pause
复制代码
作者: 老刘1号 时间: 2017-4-14 12:08
回复 2# ShowCode
他要表示的不是这个意思
作者: 老刘1号 时间: 2017-4-14 12:09
回复 4# happy886rr
谁说不支持?http://www.bathome.net/redirect. ... 3828&pid=198348
作者: ShowCode 时间: 2017-4-14 13:04
回复 5# gudou
你是在CMD窗口一行一行手工执行的吧?试试把2楼的代码保存为 test.bat 再执行看看
作者: ShowCode 时间: 2017-4-14 13:06
回复 7# 老刘1号
他要的不是这个意思。他是从某个地方已经取到这个带百分号的字符串了,你不能先把1个%替换成2个%然后再去删除啊。
作者: 老刘1号 时间: 2017-4-14 13:24
回复 11# ShowCode
光看代码你可能不信
测试就知道了
Echo那行会先解析%号,%%转义为一个%
然后解析!号,执行变量替换,将%替换为空
至于Set那行,别看Set了俩个%,存入变量里面就一个了
测试代码复制代码
作者: gudou 时间: 2017-4-14 15:01
下午好大家……
呃,我说下来龙去脉吧,想从注册表中提取系统目录,有些系统目录被自定义过了,有些还是默认的。
比如在
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 下,Desktop的值是自定义的“d:\桌面”,Programs 的值是默许的 “%USERPROFILE%\「开始」菜单\程序”
用 for /f "tokens=3" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v sendto') do set ddir=%%a (批处理售)来提取没问题,可直接用%ddir%来用,可提取的
Programs 的值到变量ddir中,内容就是 “%USERPROFILE%\「开始」菜单\程序”
这时用cd/d %ddir% 是无法进入的,所以一开始想简单了,想把%替换掉……(后来发现即使替换掉也没法用回去了,呵呵……)
作者: gudou 时间: 2017-4-14 15:45
本帖最后由 gudou 于 2017-4-14 15:55 编辑
附提取含%字符路径的方法,可能还不成熟:- for /f "tokens=3" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set dirtmp=%%a
- ECHO SET dirtmp=%dirtmp%>"%temp%\cxdir.bat"
- ECHO 桌面“Desktop”注册表中:%dirtmp%
- call "%temp%\cxdir.bat"
- ECHO 桌面“Desktop”实际:%dirtmp%
- PAUSE>NUL
复制代码
作者: gudou 时间: 2017-4-14 15:55
回复 7# 老刘1号
呃,刚重看了下,对,原来想的就是这个意思!!大神啊,没想到用这样的方式解决了!!谢谢
作者: gudou 时间: 2017-4-14 16:03
回复 10# ShowCode
呃,我把代码少了个%……“老刘1号”也没理解错
作者: pcl_test 时间: 2017-4-14 16:31
回复 13# gudou - @echo off
- set "regstr=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
- for /f "tokens=2*" %%a in ('reg query "%regstr%" /v Programs^|find /i "REG_EXPAND_SZ"') do (
- echo;%%b
- call set "fd=%%b"
- )
- echo;%fd%
- cd /d "%fd%"
- dir
- pause
复制代码
作者: dingcool 时间: 2017-4-14 22:49
谢谢 ~~~~~~~~~~学习到了很多
作者: taofan712 时间: 2017-4-18 16:52
学习了,这个之前真不知道。
作者: terse 时间: 2017-4-18 17:35
下午好大家……
呃,我说下来龙去脉吧,想从注册表中提取系统目录,有些系统目录被自定义过了,有些还是 ...
gudou 发表于 2017-4-14 15:01
替换什么 就进入的话 试下直接call cd/d "%dirtmp%"
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |