1

*.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 文件中的文本。

文件夹树是这样的:

  • 文件夹/1.oeaccount
  • 文件夹/2.oeaccount
  • 文件夹/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
4

1 回答 1

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>

与 XML 一样有效

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

因此重新换行可能会破坏您的搜索模式。

于 2013-02-17T12:57:56.527 回答