使用檔案和資料夾

流覽PowerShell磁碟驅動器並操作其上的項目類似於操作 Windows 磁碟驅動器上的檔案和資料夾。 本文討論如何使用 PowerShell 處理特定檔案和資料夾操作工作。

列出資料夾中的所有檔案和資料夾

您可以使用 直接在資料夾 Get-ChildItem內取得所有專案。 新增選擇性 Force 參數以顯示隱藏或系統專案。 例如,此命令會顯示 PowerShell 磁碟驅動器 C:的直接內容。

Get-ChildItem -Path C:\ -Force

命令只會列出直接包含的專案,就像在 UNIX 殼層中使用 dircmd.exe 命令 ls 一樣。 若要在子資料夾中顯示專案,您必須指定 Recurse 參數。 下列命令會列出磁碟驅動器上 C: 的所有內容:

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem 可以使用其 PathFilterIncludeExclude 參數來篩選專案,但這些參數通常僅以名稱為基礎。 您可以使用 ,根據專案 Where-Object的其他屬性執行複雜的篩選。

下列命令會尋找 Program Files 資料夾中的所有可執行檔,這些可執行檔上次修改時間是在 2005 年 10 月 1 日之後,且不是小於 1 MB 或大於 10 MB:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

複製檔案和資料夾

複製是使用 Copy-Item來完成。 下列命令會備份您的 PowerShell 設定檔文稿:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

命令 Test-Path 會檢查配置檔文本是否存在。

如果目的地檔案已經存在,複製嘗試就會失敗。 若要覆寫既有目的地,請使用 Force 參數:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

即使目的地是唯讀,此命令仍可運作。

資料夾複製的運作方式相同。 此命令會以遞歸方式將資料夾 C:\temp\test1 複製到新的資料夾 C:\temp\DeleteMe

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

您也可以複製項目的選取範圍。 下列命令會將 中任何位置C:\dataC:\temp\text包含的所有.txt檔案複製到 :

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

您仍然可以執行和 之類的xcopy.exerobocopy.exe原生命令來複製檔案。

建立檔案和資料夾

在所有 PowerShell 提供者上建立新項目的運作方式相同。 例如,如果 PowerShell 提供者有多個項目類型,則 FileSystem PowerShell 提供者會區分目錄和檔案,您需要指定項目類型。

這個指令會建立新的資料夾 C:\temp\New Folder

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

此命令會建立新的空白檔案 C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

重要

搭配命令使用 Force 參數 New-Item 來建立資料夾,且資料夾已經存在時, 它不會 覆寫或取代資料夾。 它只會傳回現有的資料夾物件。 不過,如果您在 New-Item -Force 已經存在的檔案上使用 ,則會覆寫檔案。

拿掉資料夾內的所有檔案和資料夾

您可以使用 移除包含的專案,但如果專案包含任何其他項目 Remove-Item,系統會提示您確認移除。 例如,如果您嘗試刪除包含其他項目的資料夾 C:\temp\DeleteMe ,PowerShell 會在刪除資料夾之前提示您確認:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

如果您不想針對每個自主專案提示,請指定 Recurse 參數:

Remove-Item -Path C:\temp\DeleteMe -Recurse

將本機資料夾對應為磁碟驅動器

您也可以使用 New-PSDrive 命令來對應本機資料夾。 下列命令會建立以本機 Program Files 目錄為根目錄的本機磁碟驅動器 P: ,僅可從 PowerShell 會話看見:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

就像網路驅動器機一樣,PowerShell 殼層會立即看到 PowerShell 內對應的磁碟驅動器。 若要從 檔案總管 建立可見的對應磁碟驅動器,請使用 Persist 參數。 不過,只能搭配 Persist使用遠端路徑。

將文字檔讀入陣列

文字數據的其中一個較常見的儲存格式是在檔案中,將個別行視為不同的數據元素。 Get-Content Cmdlet 可用來在一個步驟中讀取整個檔案,如下所示:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content 會將從檔案讀取的數據視為數位,每行檔案內容各有一個專案。 您可以藉由檢查 傳回內容的長度 來確認此問題:

PS> (Get-Content -Path $PROFILE).Length
3

此命令最適合用來將資訊清單放入PowerShell。 例如,您可能會將計算機名稱或IP位址的清單儲存在檔案 C:\temp\domainMembers.txt中,檔案的每一行都有一個名稱。 您可以使用 Get-Content 來擷取檔案內容,並將其放入 變數 $Computers中:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers 現在是陣列,其中包含每個元素中的計算機名稱。