此站点中的某位优秀人员在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; “”代码不起作用
并通过
中的文本文件中找到的电子邮件更改文件夹名称答案 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