2017-02-02 3 views
0

私は数百のファイルを含むフォルダを持っています。彼らの名前はファイルの日付の部分に基づいて一連のファイルを一連の日付に名前を変更しますか?

  • file.001.txt
  • file.002.txt
  • file.003.txt
  • ...
  • file.223.txt

私は、次のロジックでそれらの名前をすべて変更するためのpowershellスクリプトを書こうとしています。キー日付を取る。 2015年1月1日と言ってください。そして、ファイル名の最後にあるインデックス番号に基づいて、その日付を繰り返します。

  • file.01.02.2015.txt
  • file.01.03.2015.txt
  • file.01.04.2015.txt
  • ...
  • ファイル:だから、で終わります。 08.12.2015.txt

コードサンプル私は断言しましたが、これを表現する方法はありませんでした。

Get-ChildItem "C:\MyFiles" -Filter 
*.txt | Foreach-Object { 
    $OldName = $_.name; 
    $IndexPortion = $_.name.Substring(6,3) 
    $DatePortion = [datetime]::ParseExact('01/01/2015','MM/dd/yyyy',$null).AddDays($IndexPortion) 
    ## ??? $NewName = $_.name -replace $IndexPortion, $DatePortion -format yyyy.MM.dd 
    Rename-Item -Newname $NewName; 
    Write-Output $("Renamed {0} to {1}" -f $OldName, $NewName) 
} 

答えて

4
Get-ChildItem *.txt | Rename-Item -NewName { 
    $num = $_.Name.Split('.')[-2] 
    $_.Name -replace $num, (Get-Date '2015-01-01').AddDays($num).ToString('MM-dd-yyyy') 
} -whatif 

What if: Performing the operation "Rename File" on target "Item: D:\t\file.001.txt Destination: D:\t\file.01-02-2015.txt". 
What if: Performing the operation "Rename File" on target "Item: D:\t\file.002.txt Destination: D:\t\file.01-03-2015.txt". 
What if: Performing the operation "Rename File" on target "Item: D:\t\file.003.txt Destination: D:\t\file.01-04-2015.txt". 

数字は他の場所、ファイル名ではない場合、これは動作するはずです(file 001 test.001.txt

あなたは自分のコードが名前を変更するためにどのようなファイル言わずRename-Item -Newname $NewName;を置くことはできません、とのことができますパイプラインファイルをRename-Itemに追加し、スクリプトブロックで新しい名前を計算するので、ループは必要ありません。

日付の計算方法はさまざまですが、ファイルを分割して2番目のエントリを取得し、Get-Dateを固定ストリングから取得しました。 ParseExactのアプローチもかなり賢明です。

+0

。すべての種類の変換などがあると、私は迷子になりました。それは私がC#の背景から来るために得るものです。 – RThomas

1

このパターンはあなたの問題を解決できるはずです。必要に応じて調整してください。魅力のように働いたおかげ

CODE

$inputs = @() 
$inputs += 'file.001.txt' 
$inputs += 'file.002.txt' 
$inputs += 'file.100.txt' 
$inputs += 'file.234.txt' 
$inputs += 'file.1234.txt' 

$epoch = [DateTime]::Parse("1/1/2015") 
$inputs | % { 
    $oldName = $_ 
    $pre, $id, $post = $oldName -split '\.' 
    $newDate = $epoch.AddDays($id) 
    $newId = $newDate.ToString("MM.dd.yyyy") 
    $newName = "{0}.{1}.{2}" -f $pre, $newId, $post 

    Write-Output "$oldName ==> $newName" 
} 

OUTPUT

file.001.txt ==> file.01.02.2015.txt 
file.002.txt ==> file.01.03.2015.txt 
file.100.txt ==> file.04.11.2015.txt 
file.234.txt ==> file.08.23.2015.txt 
file.1234.txt ==> file.05.19.2018.txt 
+0

おかげで、常に他のアプローチを見ていいです – RThomas

関連する問題