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

[文本处理] 【已解决】批处理如何替换文本中多个内容?

本帖最后由 滴血雄鹰 于 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 17:24 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d /s /b c:\9999.vmx') do (
  3. set list=aaa=bbb;ccc=ddd;eee=fff;
  4. echo %%i
  5. call:loop "%%i"
  6. )
  7. pause&goto:eof
  8. :loop
  9. if not defined list del tmp.tmp&goto:eof
  10. for /f "tokens=1,* delims=;" %%i in ("%list%") do (set tmp=%%i&set list=%%j)
  11. for /f "tokens=1,2 delims==" %%i in ("%tmp%") do (set a=%%i&set b=%%j)
  12. (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
  13. goto:loop
复制代码
Life is a balance.

TOP

本帖最后由 滴血雄鹰 于 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;

TOP

会用PS就简单

TOP

本帖最后由 happyxxdhaha 于 2019-2-24 14:19 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d /s /b c:\9999.vmx') do (
  3. echo %%i
  4. call:next "%%i"
  5. )
  6. pause&goto:eof
  7. :next
  8. for /f "tokens=1,2 delims=;" %%i in ('more +17 "%~f0"') do (
  9. set old=%%i&set old=!old:"="""!
  10. set new=%%j
  11. (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
  12. )
  13. del tmp.tmp&goto:eof
  14. :list
  15. rem 整行替换,分隔符为分号。
  16. ethernet0.networkName = "VM Network";ethernet0.networkName = "VM Network 2"
  17. scsi0:0.fileName = "/vmfs/volumes/datastore1/8800/8800.vmdk";scsi0:0.fileName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/test.vmdk"
  18. sched.swap.derivedName = "/vmfs/volumes/datastore1/9999/9999-f17ab1e4.vswp";sched.swap.derivedName = "/vmfs/volumes/53dc6d93-3bf4396b-0807-0024817f82ad/test.vswp"
复制代码
1

评分人数

Life is a balance.

TOP

本帖最后由 滴血雄鹰 于 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"

TOP

本帖最后由 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楼的代码,我又修改了一下,你再试试看。
Life is a balance.

TOP

本帖最后由 滴血雄鹰 于 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
)

TOP

回复 8# 滴血雄鹰

5楼的代码已修改,把这两个功能整合到一起了。
Life is a balance.

TOP

回复 9# happyxxdhaha


    谢谢!

TOP

返回列表