在* .oeaccount文件中查找文本后更改文件夹名称

时间:2013-02-17 09:03:41

标签: xml batch-file cmd dos rename

我在许多文件夹中都有*.oeaccount个文件(XML文件)。我希望批处理文件读取XML文件中的文本并重命名包含该文件的文件夹。

xml文件包含类似于以下内容的文本:

    <SMTP_Display_Name type="SZ">abc@cba.com</SMTP_Display_Name>
    <SMTP_Email_Address type="SZ">abc@cba.com</SMTP_Email_Address>
    <SMTP_Split_Messages type="DWORD">00000000</SMTP_Split_Messages>
</MessageAccount>

批次必须在此行中找到abc@cba.com并忽略所有其他邮件:

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

在行的开头有4个空格。

批处理必须提取电子邮件地址abc@cba.com并将文件夹,每个文件夹重命名为XML文件中的文本。

文件夹树是这样的:

  • folder / 1.oeaccount
  • folder / 2.oeaccount
  • folder / 3.oeaccount

有人给了我这段代码,但它不起作用:

@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

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望将每个*.oeaccount文件的父文件夹重命名为该文件中的电子邮件地址。因为这样的事情应该有效:

for /r "C:\root\folder" %%f in (*.oeaccount) do (
  for /f "delims=<> tokens=3" %%a in (
    'findstr "<SMTP_Email_Address" "%%~ff"'
  ) do (
    ren "%%~dpf" "%%~a"
  )
)

但是,请注意,虽然它应该适用于这种特殊情况,但是面向行的XML文件处理(这是findstr所做的)通常是一个好主意,因为

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

一样有效
<SMTP_Email_Address
    type="SZ">abc@cba.com</SMTP_Email_Address>

因此重新包装行可能会影响您的搜索模式。