标题: [文本处理] [已解决]批处理如何把字符串中的某一字符全部去除? [打印本页]
作者: 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
- 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
- @echo off
- 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
- 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%&pause
复制代码
或- @echo off&setlocal enabledelayedexpansion
- 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
- for %%a in (%cc%) do (if /i "%%a"=="6e" set #==)&if defined # set "n=!n!%%a#"
- set n=%n:00#00#=%&set n=!n:#=!
- 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
为什么要操作的那么复杂呢?- @echo off&setlocal enabledelayedexpansion
- for /f "skip=4 tokens=3" %%a in ('reg query "路径" /v "键名"') do (
- set a=%%a
- set a=!a:\0=;!
- for %%b in (!a!) do (
- set/a n+=1
- set b_!n!=%%b
- )
- )
- pause
复制代码
从变量b_1、b_2。。。中就可以直接获取到这部分,为什么经过要导出、转ANSI、提取、截取、转字符这么复杂呢?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |