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

私はその質問を理解していると思います。特殊文字をカレット記号(^)でエスケープする必要があります。例:replace

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

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

以下は、XMLの関連する行が、指定したとおりに正確にフォーマットされている限り機能します。ただし、XMLの形式が変更されても有効である可能性があるため、これにはリスクが伴いますが、このコードは破損します。XMLがどのようにフォーマットされるかを正確に理解していない限り、バッチはXMLの解析には適していません。

編集-この元のコードはほとんど機能しましたが、2つの問題があります:

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 に答える