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

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

set abc=%%123%%456
(原来上面代码错写成:set abc=%123%456,不过后面的大神都看懂了……惭愧)
变量abc中文本内容是:%123%456,并且%字符的位置和数量无规律,即不用%abc:~1,3%%abc:~-3,3%来屏蔽,用如果把其中的%屏蔽呢?

用了
%abc:%=%
%abc:%%=%
%abc:^%=%

都不行……
1

评分人数

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

其实 set 之后变量的值已经不是希望的样子了,可以这样观察一下:
  1. set abc=%123%456
  2. echo %abc%
  3. pause
复制代码
1

评分人数

    • gudou: 是的,原来代码少写个%……技术 + 1

TOP

除了用
for /f "tokens=1,2,3,4,5 delims=%" %a in ("%abc%") do echo %a%b%c%d%e
这样的“方法”外还有更精准的方法吗?

即,还是想用 %abc:str1=str2% 类的替换法……

TOP

批处理不支持%号替换,直接就扩展了
  1. @echo off
  2. set "abc=%%123%%456"
  3. echo %abc%
  4. pause
复制代码

TOP

回复 2# ShowCode


    什么意思?%abc%还是 “%123%456” 没问题啊

TOP

回复 4# happy886rr


    无法替换啊……我是用来提取注册表中数据的,必须这样操作,不能直接

TOP

  1. setlocal ENABLEDELAYEDEXPANSION
  2. set "a=1%%2%%3%%%%456%%"
  3. echo !a:%%=!
  4. pause
复制代码
1

评分人数

    • gudou: 大神级答案!!技术 + 1

TOP

回复 2# ShowCode


   他要表示的不是这个意思
1

评分人数

    • gudou: 明白人!技术 + 1

TOP

回复 4# happy886rr


    谁说不支持?http://www.bathome.net/redirect. ... 3828&pid=198348

TOP

回复 5# gudou


    你是在CMD窗口一行一行手工执行的吧?试试把2楼的代码保存为 test.bat 再执行看看

TOP

回复 7# 老刘1号


    他要的不是这个意思。他是从某个地方已经取到这个带百分号的字符串了,你不能先把1个%替换成2个%然后再去删除啊。

TOP

回复 11# ShowCode


    光看代码你可能不信
测试就知道了
Echo那行会先解析%号,%%转义为一个%
然后解析!号,执行变量替换,将%替换为空
至于Set那行,别看Set了俩个%,存入变量里面就一个了
测试代码
  1. Set a=%%%%%%%%
  2. Set a
复制代码

TOP

下午好大家……

呃,我说下来龙去脉吧,想从注册表中提取系统目录,有些系统目录被自定义过了,有些还是默认的。
比如在
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% 是无法进入的,所以一开始想简单了,想把%替换掉……(后来发现即使替换掉也没法用回去了,呵呵……)

TOP

本帖最后由 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
复制代码

TOP

回复 7# 老刘1号


    呃,刚重看了下,对,原来想的就是这个意思!!大神啊,没想到用这样的方式解决了!!谢谢

TOP

返回列表