Пакетный код для изменения имени папок после чтения текстовых файлов

Кто-то отличный на этом сайте, дайте мне этот код в имя папки для изменения партии, прочитав строку из текстового файла

@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 [email protected] SMTP_Email_Address

Я хочу, чтобы код нашел это

<SMTP_Email_Address type="SZ">[email protected]</SMTP_Email_Address>

из-за этих признаков > < "" код не работает

и измените имя папки по электронной почте, находящейся в текстовом файле внутри

Ответ 1

Думаю, я понимаю вопрос. вам нужно избегать специальных символов с значком каретки (^) например замените

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

с

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

Ответ 2

Следующие действия будут работать до тех пор, пока соответствующая строка XML будет отформатирована точно так, как вы указали. Но это рискованно, потому что формат XML может измениться и оставаться в силе, но он сломает этот код. Пакет не является хорошим выбором для синтаксического анализа XML, если вы точно не знаете, как будет отформатирован XML.

EDIT - этот исходный код работал в основном, но он имеет 2 проблемы:

1) Операция сортировки может привести к использованию неправильной адресной строки. Предполагается использовать первую найденную совпадающую строку.

2) script может попытаться переименовать корневую папку. Windows не позволит этого, потому что ваш пакет script имеет свой текущий каталог, установленный для этого местоположения.

@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