0

我是 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
}

谢谢你,
汤姆

4

1 回答 1

0

听起来它不适用于子文件夹中的文件,因为您正在目标目录中创建具有不同名称(附加日期)的子文件夹,但是当您尝试复制文件时,您使用的是原始子文件夹名称到目的地的路径,因此您试图将它们复制到不存在的位置。

如果是这种情况,您可能想知道,为什么源子文件夹中的文件被复制到相应的重命名子文件夹中,但没有附加日期?很简单:因为如果你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
}
于 2014-05-08T03:49:54.447 回答