2011-07-27 22 views
1

PowerShellまたはバッチスクリプトで、次のことを行うスクリプトが必要です。Powershellでファイルのリストの名前を変更してフォルダを作成する

  1. ファイルの名前を変更し、作成日から1日をファイル名に追加します。例えば

    :(2011年7月27日を作成しました)

    foo.xlsx

    のfoo-2011-07-26.xlsx --note、それは昨日の日付です。

    日付形式はそれがある限り重要ではありません。 (作成日は同じですが)10個のファイルがありますので、ファイル名を変更したり、既存のフォルダ内のすべての* .xlsxファイルに同じ名前の行をコピーして貼り付けることができます。

  2. これらのファイルが存在するフォルダを作成し、「fooFolder-2011-07-26」(昨日の日付)という名前を付けます。

  3. 名前が変更されたファイルをそのフォルダに移動します。

私はPowerShellでの経験が限られています。それは私のtodoの言語リストで学習することです。

+0

日は、静的なのだろうか、それは常に一日になります(マイナス1)スクリプトが実行されていることを助ける

希望? – EBGreen

答えて

3

ここに行きます。あなたは上記に貼り付けるでしょう

function MoveFilesAndRenameWithDate([string]$folderPrefix, [string]$filePattern) { 
    $files = Get-ChildItem .\* -include $filePattern 
    ForEach ($file in $files) { 
    $yesterDate = $file.CreationTime.AddDays(-1).ToString('yyyy-MM-dd') 
    $newSubFolderName = '{0}-{1}' -f $folderPrefix,$yesterDate 
    if (!(Test-Path $newSubFolderName)) { 
     mkdir $newSubFolderName 
    } 
    $newFileName = '{0}-{1}{2}' -f $file.BaseName,$yesterDate,$file.Extension 
    Move-Item $file (Join-Path $newSubFolderName $newFileName) 
    } 
} 

:それは別名、配管やその他もろもろを使用して多くを短縮することができますが、あなたはまだPowerShellを使用し慣れていないため、私はあなたの読書のためのより多くの手続きのスタイルで書くことにしましたあなたのPowershellセッション(あなたのプロフィールに置く)。次に、このような関数を呼び出します。

MoveFilesAndRenameWithDate 'fooFolder' '*.xslx' 

私は上記の関数より多くの別名とパイプを使用する傾向があります。私が書いた最初のバージョンは、この後、私はPowerShellの新人にそれをより理解するためにその一部を分離:

function MoveFilesAndRenameWithDate([string]$folderPrefix, [string]$filePattern) { 
    gci .\* -include $filePattern | 
    % { $date = $_.CreationTime.AddDays(-1).ToString('yyyy-MM-dd') 
     mkdir "$folderPrefix-$date" 2>$null 
     mv $_ (join-path $newSubFolderName ('{0}-{1}{2}' -f $_.BaseName,$date,$_.Extension))} 
} 

編集:その日付に一致するファイルを日付フォルダを作成するために、両方の機能を変更します。私は一時的なディレクトリを作って、そこに移動したファイルから単一の日付を取得し、最終的にループの後にディレクトリの名前を変更することを検討しました。しかし、1日を逃し、2日以上のファイルを一緒に処理すると、これらのファイルには毎日のフォルダがあり、より一貫性があります。 まずrootfolder内のすべてのファイルを取得:

+1

最初のパラメータはあまり良くありません。サブフォルダの名前はファイルのCreationDateによって定義されているため不明です(2番目の点を参照)。ファイルが置かれているディレクトリを渡す方が良いでしょう。しかし、スクリプトの残りの部分は素晴らしいです。 –

+0

ええ、それはファイルが移動されるサブフォルダの先頭部分を渡す必要があり、ファイルから何らかの形で日付を取得するほうがよいでしょうが、一度に1日しかないという印象を受けます。日付は分かっています。 Gabeが新しい情報を提供したら、私はそれを変更します。 –

+0

ジョエルに感謝します。私はスケジュールされた仕事の一部として毎日これを稼働させることを計画しているので、最初のパラメータの一部として日付を入力することは理想的ではありません。メインフォルダとファイルは常に1つの場所(つまりC:\ reports)にありますので、パラメータとして渡したり、スクリプト内でハードコードすることができます。 – Gabe

0

OK i'veは、それが

function NameOfFunction([string]$folderpath) 
{ 
    foreach ($filepath in [System.IO.Directory]::GetFiles($folderpath)) 
    { 
     $file = New-Object System.IO.FileInfo($filepath); 
     $date = $file.CreationTime.AddDays(-1).ToString('yyyy-MM-dd'); 
     if (![System.IO.Directory]::Exists("C:\\test\foo-$date")) 
     { 
      [System.IO.Directory]::CreateDirectory("$folderpath\foo-$date"); 
     } 
     $filename = $file.Name.Remove($file.Name.LastIndexOf('.')); 
     $fileext = $file.Name.SubString($file.Name.LastIndexOf('.')); 
     $targetpath = "$folderpath\foo-$date" + '\' + $filename + '-' + $date + $fileext; 
     [System.IO.File]::Move($filepath, $targetpath); 
    } 
} 

説明しました。 Foreach Folder私たちはFileInfo-Objectを作成し、CreationTime -1 Dayを取得します。 次に、作成するディレクトリが存在するかどうかを確認し、falseの場合は作成します。 次に、ファイル名と拡張子を取得します。 最後に、新しいファイル名で新しいディレクトリにファイルを移動します。あなたは

+0

私はなぜあなたがdownvotedされたか分かりませんか?私はこれを試してみましょう。 – Gabe

関連する問題