2016-11-10 5 views
0

テストファイル自体にあるテキストに基づいてフォルダ内のすべてのファイルの名前を変更できるバッチファイルを作成しようとしています。私は下のテキストから最初の4行を貼り付けている:私は、各フォルダDATE-ドライバ名-TRUCKに名前を付けるためにしようとしています内容に基づいてTXTファイルの名前を変更するバッチファイルを作成する(不適切な構文を削除する)

09-Nov-16 07:50 AM        HAND-HELD DRIVER REPORT            PAGE: 1 
              XYZ COMPANY - AR1  

    DATE > 11/09/16 DRIVER > 1010 DRIVER NAME > Mike Smith TRUCK > 4719 

。私はまた、 "/"の日付フィールドにドロップする必要があります。どんな助けも信じられないほど高く評価されるでしょう!

+0

私は2行しか見ません。 – Squashman

+0

データを再フォーマットしました - これが正しいことを確認してください。フォーマットするには、投稿する情報を選択して '{} 'を押してください。 – Magoo

+0

4行目に興味があり、'> '記号、そう?与えられたサンプルテキストファイルから派生した名前を教えてください。あなたが名前を変更したいものを明確にしてください - ファイルまたはフォルダ(あなたは両方を挙げました)。そして、それを解決するあなた自身の試みを共有してください! – aschipfl

答えて

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
FOR /f "delims=" %%x IN (
'dir /b /a-d "%sourcedir%\*.txt" ' 
) DO (
SET "oldname=%%x" 
SET "newname=" 
SET "drivname=" 
REM detect a line with 4 ">" 
REM Process only the first found in a file 
FOR /f "usebackqtokens=1-5delims=>" %%a IN (
    "%%x") DO IF NOT DEFINED newname IF "%%e" neq "" (
    REM process date into %%i, %%j, %%k 
    FOR /f "tokens=1-3delims=/ " %%i IN ("%%b") DO (
    REM build drivname 
    CALL :procname %%d 
    REM build new filename and rename file 
    CALL :build %%k %%i %%j %%e 
) 
    IF NOT DEFINED newname ECHO %%x NOT renamed 
) 
) 

GOTO :EOF 

:procname 
IF "%2"=="" GOTO :EOF 
SET "drivname=%Drivname% %1" 
shift 
GOTO procname 

:build 
IF NOT DEFINED drivname GOTO :EOF 
SET "newname=%1%2%3-%drivname:~1%-%4" 
IF /i "%oldname%" neq "%newname%" (
ECHO(REN "%sourcedir%\%oldname%" "%newname%" 
) 
GOTO :eof 

sourcedirの設定を状況に合わせて変更する必要があります。

テスト目的で必要なRENコマンドは、単にECHOです。 コマンドが正しいことを確認したら、ECHO(RENからRENに変更して、実際にファイルの名前を変更します。

比較的簡単:

プロセス%%xに各ファイル名。そのファイル名で、4 >を含む行を探します。その行が見つかると(%%eは空ではありません)、日付は%%bになるので、%%i,j,kに解析し、+ TRUCK文字列を%%dに処理します。最後に、%%kの年、%%iの月、%%jの日、%%eのトラックナンバー、%drivname%のdrivernameを一緒に要素を構築します。

:buildルーチンは、drivnameが存在することを保証し、指定されたパラメータとdrivnameから新しいファイル名を作成します。新しい名前と古い名前が同じ場合(大文字と小文字を区別しない)、名前の変更によってエラーが発生します(ファイルはすでに以前に処理されています)ので、名前を変更しないでください。 :buildルーチンにnewnameが設定されているので、名前が変更されるとそれは繰り返されません。

最後に、newnameが設定されていない場合、ファイルには必要な形式の行がないため、その事実を報告してください。ここで

+0

これも機能しました。手伝ってくれてどうもありがとう! – Rory

0

は本当に最後の行にエコーの名前を変更するには

@Echo off 
Set BaseFld=Q:\Test\2016-11\10\ 
Set Files=*.txt 
PushD %BaseFld% 

For %%A in (%Files%) Do For /f "tokens=2-5 delims=>" %%B IN (
    'findstr "DATE.*DRIVER.*DRIVER.NAME.*TRUCK" "%%~fA"' 
    ) Do Call :Rename "%%~A" "%%B" "%%C" "%%D" "%%E" 
PopD 
Goto :Eof 

:Rename 
: Parse Date to yyMMdd 
For /F "Tokens=1-3 Delims=/ " %%F in (%2) Do Set _YMD=%%H%%F%%G 
For /F %%F in (%3) Do Set _DriverNo=%%F 
Set _DriverName=%~4 
Set _DriverName=%_DriverName: TRUCK=% 
Set /A _TruckNo=%~5 
Set "NewName=%_YMD%%_DriverName: =-%%_TruckNo%%~x1" 
If /i "%~nx1" neq "%NewName%" Echo Ren %1 "%NewName%" 

結果

Ren "Test.txt" "161109-Mike-Smith-4719.txt" 

編集ご使用の環境に合わせてBaseFldを変更、私の試みで除去されなければなりません。すでに処理されているファイルの名前を変更しないようにするには、ifが含まれています。

+0

これは魅力的に機能しました。ご協力ありがとうございました! – Rory

+0

@Roryバッチを編集し、エコーを削除するヒントを追加しました。バッチが役に立つと分かった場合は、回答を確認したり、投票したりできます。乾杯。 – LotPings

関連する問題