0

这个网站的好人通过从文本文件中读取行在批量更改文件夹名称时给我这个代码

@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>

由于这个标志> <“”代码不起作用

并通过在里面的文本文件中找到的电子邮件更改文件夹名称

4

2 回答 2

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
于 2013-01-10T15:01:59.577 回答
1

我想我理解这个问题。您需要使用插入符号 (^) 转义特殊字符,例如替换

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

"^<SMTP_Email_Address  *type=^"SZ^"^>  *[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*  *^<^/SMTP_Email_Address^>"
于 2013-01-09T10:04:18.500 回答