递归文件夹并重命名文件,并将创建日期添加到filename

时间:2014-05-07 23:53:50

标签: powershell copy-item

我是powershell的新手,但已经找到了我在工作中需要的一些东西。我们在与测试位置相关的文件夹中有测试结果文件(PDF,XLS.TXT等)。大多数文件夹都有包含文件的子文件夹。老板要求测试日期必须附加到文件名的末尾(test_results.pdf - > test_results - 2014-05-06.pdf)。

我的代码 获取创建日期并附加它,但它只适用于源文件夹中的文件夹,也附加了文件夹的创建日期。如果所有文件都在正确的位置,我不介意文件夹名称中的日期。源子文件夹中的文件将写入新子文件,但不会附加创建日期。

非常感谢任何帮助。这是我的代码:

$SourceDir= 'C:\modem\'
$targetDir = 'C:\test2\'

set-location -path $sourceDir

$files = get-childitem -recurse 
foreach ($file in $files)
{
 [string]$strippedFileName =[io.path]::GetFileNameWithoutExtension($file);
 [string]$extension = [io.Path]::GetExtension($file);
 [string]$crtime=$file.CreationTime.toString(' - yyyy-MM-dd');
 [string]$sourceFilePath = $file.DirectoryName; 
 [string]$DestinationFile = $targetDir + $sourcefilepath.trimstart($sourceDir) + "\" + $strippedFileName +$crtime + $extension;
 Copy-Item $file.Fullname  -Destination $DestinationFile -recurse -Force
}

谢谢你,
汤姆

1 个答案:

答案 0 :(得分:0)

听起来它对子文件夹中的文件不起作用,因为您在目标目录中创建了具有不同名称(附加日期)的子文件夹,但是当您尝试复制文件时,您&# 39;重新使用目的地路径中的原始子文件夹名称,以便您尝试将它们复制到不存在的位置。

如果是这种情况,您可能想知道,为什么源子文件夹中的文件会被复制到相应的重命名子文件夹,但是没有附加日期?简单:因为如果你Copy-Item -Recurse一个文件夹,所有内容都会被复制。子文件夹中的文件不会被 foreach 循环单独复制;每次创建新的(重命名的)子文件夹时,它们都会被循环的最后一行一次性复制。

您可以通过简单地从 Get-ChildItem 的结果中删除目录来同时解决这两个问题。

在PowerShell 1和2中:

$files = Get-Childitem -Recurse | ?{$_.PSIsContainer}

在PowerShell 3及更高版本中:

$files = Get-Childitem -Recurse -File

此外,您似乎是以强类型语言来自.NET编程背景(我根据您的口音猜测C#)。 PowerShell是动态类型的;没有必要(也没有优势)将所有变量都转换为字符串。这些分配将使他们成为弦乐。此外,您不需要 [IO.Path] 来获取文件名的部分内容;它们是 Get-ChildItem 返回的FileInfo对象的属性。

你可以写这样的循环:

foreach ($file in $files)
{
  $strippedFileName = $file.BaseName;
  $extension = $file.Extension;
  $crtime=$file.CreationTime.toString(' - yyyy-MM-dd');
  $sourceFilePath = $file.DirectoryName;
  $DestinationFile = $targetDir + $sourcefilepath.TrimStart($sourceDir) + "\" + $strippedFileName +$crtime + $extension;
  Copy-Item $file.FullName  -Destination $DestinationFile -Recurse -Force
}