2016-03-24 39 views

答えて

0

最短解はPowerShell's date formattingとなります。ここでは、その文字列形式をどのように変換できるかを簡略化したデモです。 CMDラインでこれを入力します。

powershell "([datetime]'01DEC2012').ToString('MMddyyyy')" 

出力:

そこから、正規表現そのDateTimeオブジェクトのToString()でどんな試合を交換後、最初の形式を一致させることができます代用。これを.bat拡張子で保存し、それにショットをつけてください。

<# : batch portion 
@echo off & setlocal 

rem // re-evaluate self with PowerShell 
powershell -noprofile "iex (${%~f0} | out-string)" 
goto :EOF 

: end batch/begin PowerShell polyglot code #> 

# Get all files in the current directory. For each, check for regexp matching 
# [0-9]{2}[a-z]{3}[0-9]{4}. If matched, cast the match as a DateTime object, 
# convert its format, and rename the matched file 

gci | ?{ $_.Name -match "\d\d[a-z]{3}\d{4}" } | %{ 
    $target = ([datetime]$matches[0]).ToString("MMddyyyy") 
    $newname = $_.Name -replace $matches[0], $target 
    ren $_.FullName $newname 
    "{0} -> {1}" -f $_.Name, $newname 
} 
1

(編集したが、まだテストしていません)

setlocal enableDelayedExpansion 
set "months=JAN-01 FEB-02 MAR-03 APR-04 MAY-05 JUN-06 JUL-07 AUG-08 SEP-09 OCT-10 NOV-11 DEC-12" 
for /f "tokens=* delims=" %%a in ('dir /b /a:-d^|findstr /i /r "[0-9][0-9][A-Z][A-Z][A-X][0-9][0-9][0-9][0-9]*"') do (
    set "filename=%%~a" 
    set "datepart=!filename:~0,9!" 
    set "rest=!filename:~9!" 
    set "day=!filename:~0,2!" 
    set "mon=!filename:~2,3!" 
    for %%# in (%months%) do (
    for /f "tokens=1,2 delims=-" %%x in ("%%#") do (
     if /I !mon! equ %%x (
      set "!mon2!=%%y" 
     ) 
    ) 
) 

    set "year=!filename:~5,4!" 
    rem remove the "echo" to activate renaming 
    echo ren "!datepart!!rest!" "!mon2!!day!!year!!rest!" 

) 
+2

私はOPが3桁の月の略語を2桁の月の数字に変換したいと考えています。 – dbenham

+0

@dbenham - ああ..質問は明らかにされていませんでしたが... – npocmaka

+1

私は同意する、質問はあいまいです。私はソースがMMMを持っているという事実に基づいて、教育的なケースを作るだけですが、ターゲットはMMしかありません。しかし、実際の文字列がYYYYを使用していても、オリジナルの質問(編集前)はYYYを使用していたため、私は自信がありませんでした。 – dbenham

2

テストされていません - を私は強くあなたの代わりにMMDDYYYYのYYYYMMDD形式を使用することを推奨します。これにより、ファイルを時系列でソートすることができます。しかし、私の答えはMMDDYYYYと書いてあります。

私はJREN.BAT - a regular expression file renaming utility with date/time functionalityを使用します。これは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドJScript /バッチ)です。

あなたの日付は英語の3文字の略語を使用していると仮定しています。

次の単純なコマンドは、テストモードでファイルの名前を変更します。つまり、実際に何も実行せずにファイルの名前を変更する方法を示します。実際にファイルの名前を変更するには、/Tオプションを削除します。

jren "\d\d[a-zA-Z]{3}\d{4}" "ts({dt:$0,fmt:'{MM}{DD}{YYYY}'})" /j /t 

上記の問題は、実際に日付が含まれていないファイルの名前を簡単に変更できることです。たとえば、6412DEC2016875には日付形式が埋め込まれていますが、おそらく日付ではありません。 99ABC1234のようなものは検索パターンにマッチしますが、明らかに日付ではなく、JRENコマンドは失敗します。

より複雑な正規表現検索を使用して、真の日付のみを照合することができます。以下は、英語の3文字の月の略語にのみ一致し、日前または年の後に余分な数字がある場合、可能な日付文字列は無視されます。しかし、42のような無効な日が見つかると、これは失敗する可能性があります。

jren "(^|\D)(\d\d(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{4})(?=\D|$)" "$1+ts({dt:$2,fmt:'{MM}{DD}{YYYY}'})" /j /i /t 

コマンドをバッチスクリプト内に入れる場合は、CALL JRENを使用する必要があります。

1
@echo off 
setlocal EnableDelayedExpansion 

rem Define the array to convert month names to month numbers 
set m=100 
for %%m in (JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC) do (
    set /A m+=1 
    set "month[%%m]=!m:~1!" 
) 
rem Previous FOR is equivalent to: set "month[JAN]=01", set "month[FEB]=02", ... 

rem Process the files 
for %%f in (*.*) do (
    set "name=%%f" 
    for %%m in (!name:~2,3!) do if defined month[%%m] (
     ECHO ren "%%f" "!month[%%m]!!name:~0,2!!name:~5!" 
    ) else (
     echo The file "%%f" have not DDMMMYYYY format 
    ) 
) 
+0

応答をありがとう。これらはまだ働いていないが、私はそれが私には明らかではないと思う。 lastname、firstname_documentname_DDMMMYYYY.pdf EX:SMITH、JOHN_RESUME_03DEC2013.PDFフォーマットを変更しようとしています:Smith、John_Resume_12032013.pdf – APARD

+0

問題の説明が不完全な場合は、元の質問。読むのが非常に難しいコメントに、追加の詳細を投稿しないでください!また、ファイル名にコンマをつけることはできません! – Aacini

関連する問題