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 に答える