HOWTO · PowerShell

在 PowerShell 中排除資料夾的複製項目

本教程演示了如何在 PowerShell 中複製項目並排除文件夾。

在檔案管理和自動化的 PowerShell 領域中,複製檔案的同時排除特定資料夾是一項常見但複雜的挑戰。本文深入探討了達成此任務的兩種有效方法:使用 Get-Item 函數搭配 -Exclude 參數,以及利用 Where-ObjectPSIsContainer 屬性。

這兩種方法雖然都是為了達到相同的目的,但從不同的角度處理問題,並提供獨特的優勢。

我們的目標是提供這些方法的全面理解,包括它們的應用及使用上的細微差別。通過詳細的解釋、語法分解和實用的示例,我們旨在讓新手和有經驗的 PowerShell 使用者都能掌握有效管理檔案複製任務的技能,並根據其工作流的特定要求量身定制他們的操作方法。

使用 Get-Item 函數和 -Exclude 參數在 PowerShell 複製操作中排除資料夾

我們可以使用 Copy-Item 命令在 PowerShell 中複製檔案,同時排除一個資料夾。有兩種方法可以在排除資料夾的情況下使用 Copy-Item,一種是排除單個資料夾,另一種是排除多個資料夾。

此操作的語法結合了 Copy-ItemGet-Item -Exclude:

Copy-Item -Path (Get-Item -Path "sourcePath\*" -Exclude ('folderToExclude')).FullName -Destination "destinationPath" -Recurse -Force

參數:

  • Copy-Item:此 cmdlet 將檔案和目錄複製到新位置。
  • -Path:指定要複製的項目的路徑。在我們的案例中,這是由 Get-Item 提供的。
  • Get-Item:從指定位置檢索項目。
  • -Exclude:此參數在 Get-Item 中過濾掉項目,特別是要排除的資料夾或檔案名稱。
  • ('folderToExclude'):您希望排除的資料夾名稱。
  • .FullName:檢索項目的完整路徑。
  • -Destination:要複製項目到的路徑。
  • -Recurse:包含子目錄的內容。
  • -Force:強制命令執行而不要求用戶確認。

代碼示例:

Copy-Item -Path (Get-Item -Path "origin\*" -Exclude ('SubFolder')).FullName -Destination "destination\" -Recurse -Force

在我們的腳本中,我們首先針對源目錄 (C:\origin\) 並使用 Get-Item 來檢索其包含的所有項目。這裡的星號 (*) 符號作為萬用字元,代表目錄中的每個項目。

然後我們利用 -Exclude 參數來表達我們希望排除一個特定的子資料夾,特別命名為 SubFolder。在此上下文中使用 .FullName 屬性非常重要,因為它獲取我們處理的每個項目的完整路徑。

在策劃此列表後,該列表明確排除了指定的資料夾,並交給 Copy-Item。我們將目標位置定義為目標目錄 (C:\destination)。為了確保一個全面的複製過程,涵蓋所有子目錄,除了我們選擇排除的那一個,我們加入了 -Recurse 參數。

為了進一步順利進行,避免潛在的中斷,-Force 參數開始發揮作用。它有效抑制了任何系統提示,這些提示可能會暫停操作,特別是那些與覆蓋目標目錄中現有檔案相關的提示。

origin 資料夾:

powershell 複製項目排除資料夾 - 來源檔案

輸出:

powershell 複製項目排除資料夾 - 輸出

上述命令將僅排除指定的一個資料夾。我們還可以通過將多個資料夾名稱放入 -Exclude() 來排除多個資料夾。

查看排除多個資料夾的命令:

Copy-Item -Path (Get-Item -Path "origin\*" -Exclude ('SubFolder', 'SubFolder2')).FullName -Destination "destination\" -Recurse -Force

查看輸出:

powershell copy-item 排除資料夾 - 輸出

使用 Where-ObjectPSIsContainer 在 PowerShell 複製操作中排除資料夾

PowerShell 提供了一套廣泛的 cmdlet 用於檔案和資料夾的操作,Copy-Item 是一個關鍵的複製操作工具。然而,它的原生功能並不直接支持排除資料夾。

為了達成這一點,我們結合使用 Get-ChildItemWhere-ObjectPSIsContainer 屬性。這種方法特別適用於在複製操作中需要排除資料夾的同時保留檔案。

腳本結構如下:

Get-ChildItem -Path "sourcePath\" -Recurse | Where-Object { $_.PSIsContainer -notmatch 'True' } | Copy-Item -Destination "destinationPath" -Recurse -Container

參數:

  • Get-ChildItem -Path "sourcePath\" -Recurse:從指定路徑檢索所有項目(檔案和資料夾),包括子目錄。
  • Where-Object { $_.PSIsContainer -notmatch 'True' }:過濾掉所有資料夾。PSIsContainer 是一個布林屬性,對於資料夾為 True,對於檔案為 False
  • Copy-Item -Destination "destinationPath" -Recurse -Container:將剩餘的項目(檔案)複製到目的地。-Recurse 用於確保子目錄的遍歷,而 -Container 則保留目錄結構。

代碼示例:

Get-ChildItem -Path "origin\" -Recurse | Where-Object { $_.PSIsContainer -notmatch 'True' } | Copy-Item -Destination "destination\" -Recurse -Container

在我們的腳本中,我們首先從源目錄 (origin\) 收集所有項目。為此,我們使用 Get-ChildItem cmdlet。

真正的重要部分是在 Where-Object cmdlet 中,我們引入過濾器以特定地排除資料夾。這一排除基於 $_ .PSIsContainer -notmatch 'True' 的條件。

這段代碼非常重要,因為它有效過濾收集到的項目,確保僅有檔案(而非資料夾)被傳遞到管道中。

接下來,這些過濾的檔案被交給 Copy-Item cmdlet。我們的命令是將這些檔案複製到指定的目的地 (destination\)。

這一操作的一個重要方面是,它在排除資料夾本身的同時如何保留目的地的原始目錄結構。這種平衡是通過在 Copy-Item 中謹慎安排 -Recurse-Container 參數來實現的,以確保檔案結構的完整性,排除了實際的資料夾。

輸出:

powershell 複製項目排除資料夾 - 輸出

結論

總之,本文中提出的技術——使用 Get-Item 搭配 -Exclude 以及 Where-ObjectPSIsContainer——提供了強大且靈活的方式來在 PowerShell 複製操作中排除資料夾。通過理解和應用這些方法,用戶可以顯著提升他們在 PowerShell 中的檔案管理和自動化能力。

Get-Item-Exclude 的方法簡單明了,對於排除特定資料夾非常有效,而 Where-ObjectPSIsContainer 方法提供了更細緻的控制,特別適用於排除準則較為複雜或動態的情況。這兩種方法展示了 PowerShell 在處理檔案和資料夾方面的多功能性和強大,使其成為系統管理員、開發人員和 IT 專業人員的重要工具。

掌握這些知識後,用戶可以自信地應對各種檔案複製任務,確保在 Windows 環境中對其檔案管理操作進行高效且精確的控制。