Board logo

标题: [文本处理] [已解决]批处理如何把字符串中的某一字符全部去除? [打印本页]

作者: gudou    时间: 2010-5-2 17:18     标题: [已解决]批处理如何把字符串中的某一字符全部去除?

有一个字符串列为
00,00,00,00,00,6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00
我想把其中的6e开始一直到最后字符的逗号“,”去除,赋给一变量,觉得似乎得用for命令,具体如何做呢?
即让变量cc=6e00760034005f00640069007300700000000000
(如果能加上判断让cc=6e00760034005f006400690073007000——即发现连续的0000就停止最好)



其实源于要在XP SP3中修改一注册表中的键值,是REG_MULTI_SZ类型,共三行,第一行删除,第二行是空行,只保留第三行,我要做的是
1、先导出注册表项数据(完成)
2、转为ANSI编码(完成)
3、定位到那一行(完成)
4、把得到的00,00,00,00,00,6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00数据赋值给给变量cc(完成)
5、如何把变量cc的值变成6e00760034005f006400690073007000

[ 本帖最后由 gudou 于 2010-5-2 22:01 编辑 ]
作者: CUer    时间: 2010-5-2 17:36

  1. echo 00,00,00,00,00,6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00 | sed "s/,//g;s/^0\+//;s/\([1-9]000\)0\+/\1/"
复制代码

作者: gudou    时间: 2010-5-2 17:54

请问,sed是第三方程序么?能否只用内置命令完成呢?
作者: CUer    时间: 2010-5-2 18:10

sed是第三方程序
等等看别人怎么用内置命令完成吧
作者: namejm    时间: 2010-5-2 18:25

  请把第2步得到的ANSI编码的文本传上来看看。

  “发现连续的0000就停止最好”这一句该如何理解?请用精确的语言描述它的具体含义。
作者: hanyeguxing    时间: 2010-5-2 18:29

  1. @echo off
  2. set cc=00,00,0e,60,00,6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00
  3. for %%a in (%cc%) do (if /i "%%a"=="6e" set #==)&if defined # call set "n=%%n%%%%a#"
  4. set n=%n:00#00#=%
  5. set n=%n:#=%
  6. echo.%n%&pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set cc=00,00,0e,60,00,6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00
  3. for %%a in (%cc%) do (if /i "%%a"=="6e" set #==)&if defined # set "n=!n!%%a#"
  4. set n=%n:00#00#=%&set n=!n:#=!
  5. echo.%n%&pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-2 19:01 编辑 ]
作者: netbenton    时间: 2010-5-2 19:36

试试看这样行不?
set cc=%cc:,00,00=00@%
for /f "delims=@" %%a in ("6e%cc:*,6e=%") do set cc=%%a
set cc=%cc:,=%

[ 本帖最后由 netbenton 于 2010-5-2 19:38 编辑 ]
作者: gudou    时间: 2010-5-2 21:07

原帖由 hanyeguxing 于 2010-5-2 18:29 发表

for %%a in (%cc%) do (if /i "%%a"=="6e" set #==)&if defined # call set "n=%%n%%%%a#"
set n=%n:00#00#=%
set n=%n:#=%
echo %n%


这条命令OK!3Q!!

就是不知道是什么意思,刚开始学for……连那个set #==是什么都不知道

[ 本帖最后由 gudou 于 2010-5-2 22:11 编辑 ]
作者: gudou    时间: 2010-5-2 21:23

原帖由 namejm 于 2010-5-2 18:25 发表
  请把第2步得到的ANSI编码的文本传上来看看。

  “发现连续的0000就停止最好”这一句该如何理解?请用精确的语言描述它的具体含义。


rem "导出注册表数据到TEMP文件"
REG EXPORT HKLM\SOFTWARE\BeTwin\Workplaces\Host\WP_Hardware\DISPLAY_01 "%temp%\temp.txt">nul
rem "转换ANSI编码,Ue2a.vbs是做好的VBS脚本,用于把temp.txt编码转为ANSI"
ue2a.vbs "%temp%\temp.txt"
rem "提取出HdDeviceKey键项中的部分有用数据"
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in ('findstr "HdDeviceKey" "%temp%\temp.txt"') do set xx=%%a
set xx=!xx:~79,-7!
rem "把有用数据利用起来,修改硬件加速完全、取消屏蔽3D加速功能"
reg add HKLM\SYSTEM\CurrentControlSet\Control\Video\%xx%\0001 /v Acceleration.Level /t reg_dword /d 0 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Video\%xx%\0001 /v CapabilityOverride /t reg_dword /d 0 /f
rem "把驱动的BeTwinDD删除,只用原来驱动"
REG EXPORT HKLM\SYSTEM\CurrentControlSet\Control\Video\%xx%\0001 "%temp%\temp.txt">nul
ue2a.vbs "%temp%\temp.txt"
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in ('findstr "00,00,00,00,00,6e" "%temp%\temp.txt"') do set cc=%%a
set cc=!cc:~17!

到这步为止,让变量cc的值为字符串“6e,00,76,00,34,00,5f,00,64,00,69,00,73,00,70,00,00,00,00,00”

本意是想导入这些字符串对应的文本,但发现 reg add 命令导入的不是6e007600……等……晕啊,这样要找把6e007600(或是6e,00,76,00……,这样就不需要用命令把字符串中的“,”删除了)转换成对应字符的命令了……哎
作者: hanyeguxing    时间: 2010-5-2 22:16

楼主要提供REG EXPORT HKLM\SOFTWARE\BeTwin\Workplaces\Host\WP_Hardware\DISPLAY_01 "%temp%\temp.txt">nul导出的文本内容,最好上传
作者: gudou    时间: 2010-5-3 04:40

REG EXPORT HKLM\SOFTWARE\BeTwin\Workplaces\Host\WP_Hardware\DISPLAY_01 "%temp%\temp.txt">nul导出的文本内容


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\BeTwin\Workplaces\Host\WP_Hardware\DISPLAY_01]
"HdClass"="DISPLAY"
"HdProd"="NVIDIA"
"HdDesc"="NVIDIA GeForce 7100 GS"
"HdRegPath"="System\\CurrentControlSet\\Control\\Video\\{0C13BB5B-D0FE-410E-8873-18CFB7FE7B7E}\\0000"
"HdBus"="PCI"
"HdID"="PCI\\VEN_10DE&DEV_016A&SUBSYS_00000000&REV_A1"
"HdMediaType"=dword:00000000
"HdStatus"=hex:00,00,00,00
"HdHIDPath"=""
"HdDeviceKey"="\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{0C13BB5B-D0FE-410E-8873-18CFB7FE7B7E}\\0000"
"HdDeviceName"="\\Device\\Video1"

[ 本帖最后由 gudou 于 2010-5-3 04:42 编辑 ]
作者: terse    时间: 2010-5-3 10:44

转为字符后再写入注册表
"6e00760034005f006400690073007000" 转为 "nv4_disp"
作者: gudou    时间: 2010-5-4 14:03

原帖由 terse 于 2010-5-3 10:44 发表
转为字符后再写入注册表
"6e00760034005f006400690073007000" 转为 "nv4_disp"


思路是这样的,但好像没法这样做吧
作者: Batcher    时间: 2010-5-4 18:44     标题: 回复 13楼 的帖子

terse兄明明已经算出来了,你为什么还说没法这样做呢?
作者: gudou    时间: 2010-5-8 21:12

原帖由 Batcher 于 2010-5-4 18:44 发表
terse兄明明已经算出来了,你为什么还说没法这样做呢?


我的意思是无法在CMD环境中把那种6e00。。。转换为字符nv4_disp吧,之前找到过VBS脚本,但是针对文件的,不会改为直接转换字符串的
作者: Batcher    时间: 2010-5-8 21:33     标题: 回复 15楼 的帖子

可以用BAT动态生成一个VBS来实现字符转ASCII
或者使用第三方命令行工具也行
作者: hanyeguxing    时间: 2010-5-8 22:57

为什么要操作的那么复杂呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=4 tokens=3" %%a in ('reg query "路径" /v "键名"') do (
  3. set a=%%a
  4. set a=!a:\0=;!
  5. for %%b in (!a!) do (
  6. set/a n+=1
  7. set b_!n!=%%b
  8. )
  9. )
  10. pause
复制代码
从变量b_1、b_2。。。中就可以直接获取到这部分,为什么经过要导出、转ANSI、提取、截取、转字符这么复杂呢?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2