在Powershell中重命名文件列表并创建文件夹

时间:2011-07-27 19:13:21

标签: scripting powershell

我需要一个脚本,在PowerShell或批处理脚本中,它将执行以下操作。

  1. 重命名文件,将创建日期减去1天附加到文件名。

    例如:

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

    foo-2011-07-26.xlsx - 注意,这是昨天的日期。

    日期格式并不重要,只要它在那里。将有10个文件(所有文件都具有相同的创建日期),因此我可以复制并粘贴不同文件的相同重命名行(只需重命名文件名)或只是让脚本影响现有文件夹中的所有* .xlsx文件。

  2. 创建一个新文件夹,将这些文件命名为'fooFolder-2011-07-26'(昨天的日期)。

  3. 将这些重命名的文件移动到该文件夹​​。
  4. 我对PowerShell的经验有限。这是我要学习的todo语言列表..

2 个答案:

答案 0 :(得分: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))}
}

编辑:修改了两个函数,以便为与该日期匹配的文件创建日期文件夹。我考虑制作一个临时目录并从移动到它的文件中抓取一个日期,最后在循环后重命名目录。但是,如果错过一天并且一起处理2天(或更多天)的文件,那么每天仍然会有一个文件夹,这些文件更加一致。

答案 1 :(得分:0)

好的,我已经成功了

 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-Object并获得CreationTime -1天。 然后我们检查是否存在应该创建的目录,如果为false则创建它。 然后我们得到文件名和扩展名。 最后,我们将文件移动到新文件名下的新目录。

希望能帮到你