2011-09-16 434 views
10

我正在編寫一個腳本,用於分析文件。我的問題是文件名在多個文件夾中不唯一,因此它們被覆蓋。Powershell獲取文件的父文件夾

例如:

C:\StuffToCopy\Folder1\myFile1.txt 
C:\StuffToCopy\Folder1\myFile2.txt 
C:\StuffToCopy\Folder2\myFile1.txt 
C:\StuffToCopy\Folder2\myFile2.txt 

在我的複製過程,我只得到2個文件的末尾,但我想4

我想輸出是這樣的:

C:\ArchiveCopy\Folder1_myFile1.txt 
C:\ArchiveCopy\Folder1_myFile2.txt 
C:\ArchiveCopy\Folder2_myFile1.txt 
C:\ArchiveCopy\Folder2_myFile2.txt 

這是我的腳本到目前爲止。

$files = dir -r -path "C:\StuffToCopy\" -i *.* 

foreach ($file in $files) 
{ 
    if ($file.LastWriteTime -gt (get-date).AddDays(-1)) { 
     copy -path $file C:\ArchiveCopy\ 
    } 
} 

我要像做copy -path $file.FolderName & '_' & $file C:\ArchiveCopy\

我只是不知道如何做到這一點。

回答

13

如果$file確實是一個文件 - 的System.IO.FileInfo一個實例(而不是一個真正的目錄:System.IO.DirectoryInfo),那麼它具有財產Directory這是具有NameDirectoryInfo一個實例:

$file | 
    copy-item -destination { 
    Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) } 

(使用因爲Copy-Item-LiteralPath參數將綁定到管道中的PSPath屬性,所以不需要從$file對象中抽取原始文件的名稱。)

如果$file可能是一個目錄,那麼你需要做更多的工作自己,但可能更容易先篩選出目錄:

dir -r -path C:\StuffToCopy\ | 
    where { -not $_.PSIsContainer } | 
    copy-item -destination { 
    Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) } 

注:

  • 沒有必要保存所有的文件對象然後遍歷它們:讓流水線循環播放
  • 無需-i "*.*":無論如何這是默認設置(如果需要在通配符模式中過濾文件,請選擇-filter pattern參數:將過濾器傳遞給文件系統而不是creati然後過濾它們,如果有很多文件,它們會慢得多)。
6

試試這個:

dir -r -path C:\StuffToCopy | 
     where {!$_.psiscontainer} | 
     copy -dest { "C:\ArchiveCopy\$($_.Directory.Name)_$($_.Name)"} 
3

根據你的腳本,這裏是另一種方式來做到這一點:

$files = dir -r -path "C:\StuffToCopy\" -i *.* 
$destPath = "c:\ArchiveCopy\" 

foreach ($file in $files) 
{ 

    $folderPath = Split-Path $file.fullname -parent 
    $folder = Split-Path $folderPath -leaf 
    $destFilename = $folder + "_" + $file.name 
    $destFileFullPath = $destPath + $destFilename 
    write-host $destFileFullPath 
    if ($file.LastWriteTime -eq (get-date).AddDays(0)) { 
     copy -path $file $destFileFullPath 
    } 
} 
相關問題