流覽 PowerShell 磁碟驅動器並操作其上的項目類似於操作 Windows 磁碟驅動器上的檔案和資料夾。 本文討論如何使用PowerShell處理特定檔案和資料夾作工作。
列出文件夾中所有的檔案和資料夾
您可以直接使用 Get-ChildItem
以取得資料夾中的所有項目。 新增可選的 Force 參數以顯示隱藏或系統項目。 例如,此命令會顯示PowerShell Drive C:
的直接內容。
Get-ChildItem -Path C:\ -Force
命令只會列出直接包含的項目,就像在 Unix 殼層中使用 dir
命令,或 cmd.exe
和 ls
命令一樣。 若要在子資料夾中顯示項目,您必須指定 Recurse 參數。
下列命令會列出 C:
磁碟驅動器上的所有內容:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
可以使用其 Path、Filter、Include和 Exclude 參數來篩選專案,但這些專案通常只以名稱為基礎。 您可以使用 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:\data
中的任何位置的所有 .txt
檔案複製到 C:\temp\text
:
Copy-Item -Filter *.txt -Path C:\data -Recurse -Destination C:\temp\text
您仍然可以執行原生命令,例如 xcopy.exe
和 robocopy.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
現在是一個陣列,其中每個元素中都包含一個計算機名稱。