标题: [文本处理] 【已解决】批处理如何替换文本中多个内容? [打印本页]
作者: 滴血雄鹰 时间: 2019-2-23 10:12 标题: 【已解决】批处理如何替换文本中多个内容?
本帖最后由 滴血雄鹰 于 2019-2-24 16:46 编辑
批处理如何替换文本中多个内容?
将文件9999.vmx文件中的多个内容替换:
aaa替换为bbb
ccc替换为ddd
eee替换为fff
如:ethernet0.networkName = "VM Network" 替换为ethernet0.networkName = "VM Network 2"
批处理实现:
1、支持指定目录及同本目录。
2、支持子目录。
3、支持多个目录下的多个文件9999.vmx。
下面是类似例子:
http://www.bathome.net/thread-40323-1-1.html
http://www.bathome.net/viewthread.php?tid=7807
作者: happyxxdhaha 时间: 2019-2-23 14:00
本帖最后由 happyxxdhaha 于 2019-2-23 17:24 编辑
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /a-d /s /b c:\9999.vmx') do (
- set list=aaa=bbb;ccc=ddd;eee=fff;
- echo %%i
- call:loop "%%i"
- )
- pause&goto:eof
-
- :loop
- if not defined list del tmp.tmp&goto:eof
- for /f "tokens=1,* delims=;" %%i in ("%list%") do (set tmp=%%i&set list=%%j)
- for /f "tokens=1,2 delims==" %%i in ("%tmp%") do (set a=%%i&set b=%%j)
- (for /f "usebackq delims=" %%i in (%1) do (set str=%%i&echo !str:%a%=%b%!))>tmp.tmp&>nul fc tmp.tmp %1||>nul copy tmp.tmp %1
- goto:loop
复制代码
作者: 滴血雄鹰 时间: 2019-2-23 14:19
本帖最后由 滴血雄鹰 于 2019-2-23 14:24 编辑
happyxxdhaha 发表于 2019-2-23 14:00
scsi0.present = "FALSE"替换成scsi0.present = "TRUE"
scsi0:0.deviceType = "scsi-hardDisk"替换成scsi0:0.deviceType = "disk"
scsi0:0.fileName = "/vmfs/volumes/datastore1替换成scsi0:0.fileName = "/vmfs/volumes/123456
900/900.vmdk"替换成901/900.vmdk"
这些代码无法替换。
另外:
set list=aaa=bbb;ccc=ddd;eee=fff;
能不能改成多行:
aaa=bbb;
ccc=ddd;
eee=fff;
作者: xczxczxcz 时间: 2019-2-23 15:50
会用PS就简单
作者: happyxxdhaha 时间: 2019-2-23 17:22
本帖最后由 happyxxdhaha 于 2019-2-24 14:19 编辑
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /a-d /s /b c:\9999.vmx') do (
- echo %%i
- call:next "%%i"
- )
- pause&goto:eof
-
- :next
- for /f "tokens=1,2 delims=;" %%i in ('more +17 "%~f0"') do (
- set old=%%i&set old=!old:"="""!
- set new=%%j
- (for /f "delims=" %%a in ('findstr /biv "uuid" %1') do echo %%a|>nul findstr /c:"!old!" &&echo !new!||echo %%a)>tmp.tmp&>nul findstr /c:"logging = """FALSE"""" tmp.tmp||>>tmp.tmp echo logging = "FALSE"&>nul fc tmp.tmp %1||>nul copy tmp.tmp %1
- )
- del tmp.tmp&goto:eof
-
- :list
- rem 整行替换,分隔符为分号。
- ethernet0.networkName = "VM Network";ethernet0.networkName = "VM Network 2"
- scsi0:0.fileName = "/vmfs/volumes/datastore1/8800/8800.vmdk";scsi0:0.fileName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/test.vmdk"
- sched.swap.derivedName = "/vmfs/volumes/datastore1/9999/9999-f17ab1e4.vswp";sched.swap.derivedName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/test.vswp"
复制代码
作者: 滴血雄鹰 时间: 2019-2-23 19:36
本帖最后由 滴血雄鹰 于 2019-2-23 19:43 编辑
回复 5# happyxxdhaha
测试了下:
1、替换速度太慢。
2、下面红字替换出错。
附件:9999.vmx
链接: https://pan.baidu.com/s/1_iCxMZBGbp2mv-krzsnXRQ 提取码: ytmy
如果采用先删除整行,再插入一行的方式,会不会快一些?
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /a-d /s /b e:\0000\9999.vmx') do (
echo %%i
call:next "%%i"
)
pause&goto:eof
:next
for /f "tokens=1,2 delims=;" %%i in ('more +17 "%~f0"') do (
set old=%%i&set old=!old:"=""!
set new=%%j
(for /f "usebackq delims=" %%a in (%1) do echo %%a|>nul findstr /e:"!old!" &&echo !new!||echo %%a)>tmp.tmp&>nul fc tmp.tmp %1||>nul copy tmp.tmp %1
)
goto:eof
:list
rem 整行替换,分隔符为分号。
scsi0.present = "FALSE";scsi0.present = "TRUE"
scsi0:0.deviceType = "scsi-hardDisk";scsi0:0.deviceType = "disk"
ethernet0.networkName = "VM Network";ethernet0.networkName = "VM Network 2"
scsi0:0.fileName = "/vmfs/volumes/datastore1;scsi0:0.fileName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad
sched.swap.derivedName = "/vmfs/volumes/datastore1/;sched.swap.derivedName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/
8800/8800.vmdk;8801/8800.vmdk
scsi0:0.mode = "independent-nonpersistent";scsi0:0.mode = "independent-nonpersistent"
scsi0:0.present = "FALSE";scsi0:0.present = "TRUE"
bios.forceSetupOnce = "FALSE";bios.forceSetupOnce = "TRUE"
sched.mem.min = "0";sched.mem.min = "512"
sched.mem.minSize = "0";sched.mem.minSize = "512"
作者: happyxxdhaha 时间: 2019-2-23 20:49
本帖最后由 happyxxdhaha 于 2019-2-23 21:33 编辑
回复 6# 滴血雄鹰
路径只需要修改dir /a-d /s /b 后面的字符串即可,其它地方不需要修改。findstr /c:这里的"c:"是findstr的开关,不是盘符。
list标签后面的替换代码要写完整,因为是整行替换,你只复制一半,所以出错了,要这样复制:scsi0:0.fileName = "/vmfs/volumes/datastore1/8800/8800.vmdk";scsi0:0.fileName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/test.vmdk"。
5楼的代码,我又修改了一下,你再试试看。
作者: 滴血雄鹰 时间: 2019-2-24 12:30
本帖最后由 滴血雄鹰 于 2019-2-24 12:31 编辑
回复 7# happyxxdhaha
5楼代码有效!不过运行时间要5分钟。有没有办法加快运行速度?如果5楼代码运行完了再运行下面代码,下面的代码加在哪里?
::删除uuid开头的2行
:echo off
for /f "delims=" %%a in ('dir/a-d/s/b c:\9999.vmx') do (
findstr /ri /b /v "uuid" "%%a">"%%a.tmp"
move "%%a.tmp" "%%a">nul
)
::最后一行添加指定字符
::@echo off
set add=logging = "FALSE"
for %%i in (c:\9999.vmx) do (
echo %add%>> %%i
)
作者: happyxxdhaha 时间: 2019-2-24 14:22
回复 8# 滴血雄鹰
5楼的代码已修改,把这两个功能整合到一起了。
作者: 滴血雄鹰 时间: 2019-2-24 16:48
回复 9# happyxxdhaha
谢谢!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |