批处理代码在读取文本文件后更改文件夹名称

时间:2013-01-09 09:44:04

标签: batch-file cmd rename directory findstr

此站点中的某位优秀人员在batch change folder name by read line from text file

处为我提供了此代码
@echo off
pushd "your root location"  
for /f "tokens=1* delims=:" %%A in (  
'findstr /srbc:"SMTP_Email_Address  *type=SZ  *[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*  *SMTP_Email_Address" filel.txt^|sort /r'  
) do if exist "%%A" for %%F in ("%%A\..") do (  
  for /f "tokens=3" %%N in ("%%B") do ren "%%~fF" "%%N"  
)  
popd

代码完全找到此代码

SMTP_Email_Address type=SZ name@company.com SMTP_Email_Address

我希望代码找到这个

<SMTP_Email_Address type="SZ">abc@abc.com</SMTP_Email_Address>

因为这个迹象&gt; &LT; “”代码不起作用

并通过

中的文本文件中找到的电子邮件更改文件夹名称

2 个答案:

答案 0 :(得分:1)

我想我理解这个问题。 你需要用插入符号来逃避特殊字符(^) 例如 替换

"SMTP_Email_Address  *type=SZ  *[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*  *SMTP_Email_Address"

"^<SMTP_Email_Address  *type=^"SZ^"^>  *[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*  *^<^/SMTP_Email_Address^>"

答案 1 :(得分:1)

只要XML的相关行格式与您指定的完全一致,以下内容就可以正常工作。但这是有风险的,因为XML的格式可能会改变并仍然有效,但它会破坏这段代码。批处理不是解析XML的好选择,除非您确切知道如何格式化XML。

编辑 - 这个原始代码大多有效,但它有两个问题:

1)排序操作可能导致使用错误的匹配地址行。它应该使用第一个找到的匹配行。

2)脚本可能会尝试重命名根位置。 Windows不允许这样做,因为批处理脚本的当前目录设置为该位置。

@echo off
pushd "your root location"
for /f "tokens=1,3 delims=:<>" %%A in (
  'findstr /srbc:"<SMTP_Email_Address .*>[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*</SMTP_Email_Address>" file1.txt^|sort /r'
) do if exist "%%A" for %%F in ("%%A\..") do ren "%%~fF" "%%B"
popd


以下代码已修复,以正确使用第一个匹配的地址行。它也不会尝试重命名根位置。但是,如果任何进程当前依赖于该位置,则其他重命名可能会失败。

@echo off
setlocal
pushd "YourRootLocation"
set "search=<SMTP_Email_Address .*>[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*</SMTP_Email_Address>"
for /f "eol=: delims=" %%A in (
  'findstr /srmbc:"%search%" file1.txt^|sort /r'
) do for /f "tokens=2 delims=<>" %%B in (
  'findstr /rbc:"%search%" "%%A"'
) do if exist "%%A" for %%F in ("%%A\..") do if "%%~fF" neq "%CD%" (
  echo ren "%%~fF" "%%B"
  ren "%%~fF" "%%B"
)
popd