Board logo

标题: [文本处理] 批处理如何尋找文件內容進行改名? [打印本页]

作者: nickl    时间: 2013-1-3 09:24     标题: 批处理如何尋找文件內容進行改名?

各位大俠你們好

請問如何尋找文件內容, 為文件改名
如附件
先尋找: "sup: " 後 5 個字, 底線
然後加上 "Number : " 後 6 個字, 底線
再加上 "Location   :     "  後4 個字

改完後檔案名如下 32569_259197_hk32

這些字眼不一定在固定位置, 但一定出現在文件中且不重覆,  
我是新手, 只懂用 IF %%M#== # SET =!S:~ 找出同位置的字眼
請問有辦法嗎? 謝!
作者: tmplinshi    时间: 2013-1-3 10:26

本帖最后由 tmplinshi 于 2013-1-3 11:07 编辑

需要下载 sed: http://code.google.com/p/gnu-on-windows/downloads/list
  1. @echo off
  2. setlocal
  3. set file="file A.txt"
  4. for /f "tokens=1,2 delims=:" %%a in (
  5.     ' more %file% ^| sed -r -n "s/(^|[ ]*)(SUP|Number|Location)[ ]*:[ ]*([^ ]+)/\n:\2:\3/gip" ^| sed -n "s/^://p" '
  6. ) do (
  7.     set %%a=%%b
  8. )
  9. ren %file% %sup%_%Number%_%Location%.txt
复制代码

作者: nickl    时间: 2013-1-3 10:46

本帖最后由 nickl 于 2013-1-3 10:49 编辑

先感謝
但不知為何運行後, 名字改為 __ 而已

請問能只用 bat 代碼處理嗎? 謝
作者: tmplinshi    时间: 2013-1-3 10:53

本帖最后由 tmplinshi 于 2013-1-3 11:05 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set file="file A.txt"
  4. for /f "tokens=*" %%a in (' more %file% ') do (
  5.     set str=%%a
  6.    
  7.     for %%i in (SUP Number Location) do (
  8.         set str=!str:*%%i=%%i!
  9.         set str=!str: =!
  10.         
  11.         if "!str:%%i:=!" neq "!str!" (
  12.             set %%i=!str:*:=!
  13.         )
  14.     )
  15.    
  16. )
  17. ren %file% %SUP%_%Number%_%Location%.txt
复制代码

作者: tmplinshi    时间: 2013-1-3 10:59

本帖最后由 tmplinshi 于 2013-1-3 11:08 编辑
先感謝
但不知為何運行後, 名字改為 __ 而已

請問能只用 bat 代碼處理嗎? 謝
nickl 发表于 2013-1-3 10:46



哦。忘了,你的文件编码是 UTF-16 LE,我运行批处理之前先改了编码。

现在可以了,已修改 2 楼和 4 楼的代码。
作者: nickl    时间: 2013-1-3 11:14

回复 5# tmplinshi

感謝, 能用了

有一個問題, 請問能不指定檔名, 而是更改資料夾內所有 txt 檔案嗎?
因有大量類似檔案要進行改名, 感激萬分!
作者: tmplinshi    时间: 2013-1-3 11:27

回复  tmplinshi

感謝, 能用了

有一個問題, 請問能不指定檔名, 而是更改資料夾內所有 txt ...
nickl 发表于 2013-1-3 11:14
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     set file="%%a"
  5.     for /f "tokens=*" %%a in (' more !file! ') do (
  6.         set str=%%a
  7.         
  8.         for %%i in (SUP Number Location) do (
  9.             set str=!str:*%%i=%%i!
  10.             set str=!str: =!
  11.             
  12.             if "!str:%%i:=!" neq "!str!" (
  13.                 set %%i=!str:*:=!
  14.             )
  15.         )
  16.         
  17.     )
  18.    
  19.     ren !file! !SUP!_!Number!_!Location!.txt
  20. )
复制代码

作者: nickl    时间: 2013-1-3 12:16

回复 7# tmplinshi

感謝!

運行後發現, 有些檔案因內容打錯字, (如 sup, 打成 spu)
會用了上一個檔案 (file A) 的 sup 後的內容更改(file b)檔名.

能做到如找不到 sup/number/location 就留下空白?

example: file C
SPU: 12345
number: 567899
location: HK32

以 file c 為例, 會改為 _567899_HK32

example2: file D
SUP: 12345
numb: 567899
location: HK32

以 file d 為例, 會改為 12345__HK32

example3: file E
SUP: 12345
number: 567899
loc: HK32

以 file e 為例, 會改為 12345_567899_

抱歉現在才發現文件有這樣的問題..
無論如何, 感激你的幫助!
作者: tmplinshi    时间: 2013-1-3 12:28

本帖最后由 tmplinshi 于 2013-1-3 12:32 编辑

回复 8# nickl
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     set file="%%a"
  5.     for %%i in (SUP Number Location) do set %%i=#
  6.     for /f "tokens=*" %%a in (' more !file! ') do (
  7.         set str=%%a
  8.         
  9.         for %%i in (SUP Number Location) do (
  10.             set str=!str:*%%i=%%i!
  11.             set str=!str: =!
  12.             
  13.             if "!str:%%i:=!" neq "!str!" (
  14.                 set %%i=!str:*:=!
  15.             )
  16.         )
  17.         
  18.     )
  19.    
  20.     ren !file! !SUP!_!Number!_!Location!.txt
  21. )
复制代码

作者: nickl    时间: 2013-1-3 14:13

回复 9# tmplinshi

成功了, 謝版主
作者: nickl    时间: 2013-1-4 13:29

請問有甚麼情況會出現命令引數過多的錯誤信息?

不知為何我運行上述 bat 檔案, 大部分電腦也能正常運動
但有一部卻出現命令引數過多的錯誤信息, 請問有甚麼情況會出現這個報錯呢? 有甚麼解決方法?
謝!




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