Board logo

标题: [文本处理] 【已解决】批处理如何把变量中的%字符替换掉? [打印本页]

作者: 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 之后变量的值已经不是希望的样子了,可以这样观察一下:
  1. set abc=%123%456
  2. echo %abc%
  3. 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

批处理不支持%号替换,直接就扩展了
  1. @echo off
  2. set "abc=%%123%%456"
  3. echo %abc%
  4. 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

  1. setlocal ENABLEDELAYEDEXPANSION
  2. set "a=1%%2%%3%%%%456%%"
  3. echo !a:%%=!
  4. 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了俩个%,存入变量里面就一个了
测试代码
  1. Set a=%%%%%%%%
  2. Set a
复制代码

作者: 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 编辑

附提取含%字符路径的方法,可能还不成熟:
  1. for /f "tokens=3" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set dirtmp=%%a
  2. ECHO SET dirtmp=%dirtmp%>"%temp%\cxdir.bat"
  3. ECHO 桌面“Desktop”注册表中:%dirtmp%
  4. call "%temp%\cxdir.bat"
  5. ECHO 桌面“Desktop”实际:%dirtmp%
  6. 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
  1. @echo off
  2. set "regstr=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
  3. for /f "tokens=2*" %%a in ('reg query "%regstr%" /v Programs^|find /i "REG_EXPAND_SZ"') do (
  4.     echo;%%b
  5.     call set "fd=%%b"
  6. )
  7. echo;%fd%
  8. cd /d "%fd%"
  9. dir
  10. 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://bbs.bathome.net/) Powered by Discuz! 7.2