2

.bat または .vbs スクリプト (または同様のもの) を使用して、コピーして名前を変更したいフォルダーに多数のファイルがあります。ファイルの名前は次のとおりです。

ABC-DE-(XXX)SomeNameHere.dat

ファイルをコピーして名前を変更し、(XXX) の部分を削除して、次のようにします。

ABC-DE-SomeNameHere.dat

ここで回答された同様の質問がありますが、上記のファイル名パターンで機能するように変更できませんでした。また、ファイルの名前を変更するだけで、ファイルをコピーしません。

どんな助けでも大歓迎です!どうもありがとう。


編集:以下の(ひどい!)コードを投稿してください。これは無視した方が無難でしょう;_;

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET oldname=%1
SET "newname=%~nx1"
SET "newname=%newname:*] =%"
RENAME %oldname% "%newname%"
4

2 に答える 2

2

あなたは自分に厳しすぎる。あなたのコードはあなたが思っているよりも近かった。

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET oldname=%1
SET "newname=%~nx1"
SET "newname=%newname:*)=ABC-DE-%"
RENAME %oldname% "%newname%"

上記は短縮できます

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET "name=%~nx1"
REN %1 "%name:*)=ABC-DE-%"

遅延展開を使用することで、CALL の必要性をなくすことができます

@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR %%F IN ("ABC-DE-(*)*.dat") do (
  SET name=%%~nxF
  REN "%%F" "!name:*)=ABC-DE-!"
)

上記の遅延展開ソリューションは、CALL を使用するよりも効率的ですが!、%%F 展開が遅延展開によって破損するため、ファイル名に含まれていると失敗します。これは、ループ内で遅延展開のオンとオフを切り替えることで解決できます。

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") do (
  SET oldName=%%F
  SET newName=%%~nxF
  SETLOCAL EnableDelayedExpansion
  REN "!oldName!" "!newName:*)=ABC-DE-!"
  ENDLOCAL
)
于 2012-04-16T18:50:11.507 に答える
0

ファイルの命名パターンが一貫している場合は、これを使用できます。

for /f "tokens=1-3 delims=)(" %%a in ('dir /b') do @rename "%%a(%%b)%%c" "%%a-%%c"
于 2012-04-16T19:09:23.023 に答える