2

ディレクトリに「APP_ENTITY_part___20120910.txt」の形式のファイル名があります

3つのアンダースコアの後のすべてを削除し、ファイル名の最初の部分を保持したいと思います。

これを達成する方法を教えてくれる良いウェブサイトはありますか?

または、バッチの専門家の1人が、これを行う方法を教えてくれますか?

4

3 に答える 3

6

変数拡張検索と置換を使用してREMコマンドを挿入する非常に単純なソリューションがあります。

@echo off
setlocal
for %%F in (*) do call set "var=%%F" & call :procName
exit /b

:procName
::truncate at the 1st occurance of ___
set "var=%var:___="&rem %
::print the result
set var
exit /b

重要なラインはset "var=%var:___="&rem %

var = Part1___Part2と仮定します

置換後、行は次のようになります。set "var=Part1"&rem Part2

上記のソリューションは、の最初の出現時に切り捨てられ___ます。

のような名前Part1___Part2___Part3は結果になりPart1ます。

の最後の発生時に切り捨てて、の___ような結果を取得するPart1__Part2場合、ソリューションはより複雑になります。

検索と置換を使用___してフォルダー区切り文字に変更し、次に〜p修飾子を指定した2番目のFORを使用して最後の部分を削除し、検索と置換を使用して先頭___の区切り文字を復元します。

@echo off
setlocal disableDelayedExpansion
for %%F in (*) do (
  set "var=%%F"
  setlocal enableDelayedExpansion
  set "var2=!var:___=\!"
  if "!var2!" neq "!var!" for %%A in ("\!var2!") do (
    endlocal
    set "var=%%~pA"
    setlocal enableDelayedExpansion
    set "var=!var:~1,-1!"
    set "var=!var:\=___!"
  )
  echo var=!var!
  endlocal
)
于 2012-09-10T21:17:13.097 に答える
1

Cygwinまたはいくつかの代替(「名前の変更」プログラムなどの適切なライブラリが含まれている)をインストールして、このSO質問の上位2つの回答の1つを使用できます(以下に貼り付けます)。次のいずれかを実装する前に、正規表現とグロブをテストすることをお勧めします。

rename 's/___(.*)\.txt/\.txt/' *_part___*.txt

また

for f in *_part___*.txt; do mv $f $(echo $f | sed 's/___(.*)\.txt/\.txt/g'); done

于 2012-09-10T20:50:51.057 に答える
0

あなたのためのシンプルな1行のソリューション:

set DirNam=%DirNam:~,-12%

____YYYYMMDDこれは、常に4つのアンダースコアと名前の末尾からの日付を削除するだけの場合に役立ちます。

たぶんこれを行うことによって他のディレクトリ名を整理します:

setlocal enabledelayedexpansion
for /d %%x in (*____????????) do ( 
  set DirNam=%%x
  set DirNam=!DirNam:~,-12!
  echo %%x is now !DirNam!
)
于 2012-09-14T19:56:04.813 に答える