2011-07-27 154 views
1

我需要一個腳本,在PowerShell或批處理腳本中執行以下操作。重命名文件列表並在Powershell中創建文件夾

  1. 重命名文件以將創建日期減1天添加到文件名。

    例如:

    foo.xlsx(創建2011年7月27日)

    富-2011-07-26.xlsx - 注,這是昨天的日期。

    日期格式不是太重要,只要它在那裏。將會有10個文件(全部具有相同的創建日期),所以或者我可以爲不同的文件複製和粘貼相同的重命名行(只需重命名文件名),或者讓腳本影響現有文件夾中的所有* .xlsx文件。

  2. 創建這些文件所在的新文件夾並將其命名爲'fooFolder-2011-07-26'(昨天的日期)。

  3. 將這些重命名的文件移動到該文件夾​​。

我只有有限的PowerShell經驗。這是在我待學的語言待辦清單上。

+0

該日期是靜態的還是始終是腳本運行的日期(減1)? – EBGreen

回答

3

在這裏,你去。它可以縮短了使用別名和管道和諸如此類的東西很多,但因爲你不熟悉使用PowerShell,我仍然決定在多個程序的風格來寫你的閱讀:

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會話(將其放置在您的配置文件中)。然後你調用這樣的函數:

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

第一個參數不是很好。因爲子文件夾的名稱是未知的,因爲它是由文件的創建日期定義的(請參閱他的第二點)。最好傳遞文件所在的目錄。但劇本的其餘部分很好。 –

+0

是的,只需要他通過子文件夾的開始部分將文件移到並從文件中獲取日期會更好,但我得到的印象是它一次只有一天,日期將是已知的。如果Gabe提供新的信息,我會改變它。 –

+0

謝謝喬爾。我打算每天都將這項工作作爲計劃工作的一部分,因此將日期作爲第一個參數的一部分輸入並不理想。主文件夾和文件將始終位於一個位置(即C:\ reports),因此我可以將其作爲參數傳遞或僅將其硬編碼到腳本中。 – Gabe

0

OK從來就使它

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); 
    } 
} 

說明: 首先獲得所有文件中的rootfolder。 Foreach文件夾我們創建一個FileInfo對象並獲取CreationTime -1天。 然後,我們檢查應該創建的目錄是否存在,如果存在則創建它。 然後我們得到文件名和擴展名。 在最後,我們將文件移動到新的文件名下的新目錄。

希望對你有所幫助

+0

我不確定你爲什麼被低估?我會給這是一個嘗試。 – Gabe

相關問題