2011-07-27 157 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

相关问题