瀏覽 Windows PowerShell 磁碟機以及操控這些磁碟機上的項目類似於操控 Windows 實體磁碟機上的檔案和資料夾。本節將討論如何具體處理檔案和資料夾操控作業。

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

使用 Get-ChildItem 可取得資料夾當層目錄中所有的項目。加上選擇性 Force 參數則可顯示隱藏或系統項目。例如,下列命令將顯示 Windows PowerShell 磁碟機 C (等同於 Windows 實體磁碟機 C) 根目錄的內容:

Get-ChildItem -Force C:\

此命令只會列出當層目錄中的項目,大致如同使用 Cmd.exe 的 DIR 命令或 UNIX 殼層的 ls 命令。若要顯示更內層所包含的項目,必須一併指定 -Recurse 參數 (可能需要花費很長時間才能完成)。如下所示,列出 C 磁碟機上逐層內的一切項目:

Get-ChildItem -Force C:\ -Recurse

Get-ChildItem 可透過 PathFilterIncludeExclude 參數來篩選項目,但這些參數通常都是依名稱篩選。使用 Where-Object Cmdlet 則可依項目的其他屬性執行複雜的篩選作業。

下列命令可找出 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 1m) -and ($_.Length -le 10m)}

複製檔案和資料夾

使用 Copy-Item 可複製項目。下列命令將 C:\boot.ini 備份到 C:\boot.bak:

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.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

您仍可使用其他工具執行檔案系統複製作業。Windows PowerShell 能夠使用 XCOPY、ROBOCOPY 以及 COM 物件如 Scripting.FileSystemObject。例如,下列命令使用 Windows Script Host 的 Scripting.FileSystem COM 類別將 C:\boot.ini 備份到 C:\boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")

建立檔案和資料夾

所有 Windows PowerShell 提供者建立新項目的做法都一樣。如果 Windows PowerShell 提供者的項目類型不止一種,例如 Windows PowerShell FileSystem 提供者會區別目錄和檔案,則必須指定項目類型。

下列命令建立新資料夾 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"

移除資料夾內所有的檔案和資料夾

使用 Remove-Item 可移除內含項目,但如果項目中還包含其他項目,便會提示您確認是否全部移除。例如,若您嘗試刪除內有其他項目的 C:\temp\DeleteMe 資料夾,Windows PowerShell 會在刪除資料夾前顯示確認提示:

Remove-Item C:\temp\DeleteMe

Confirm
The item at C:\temp\DeleteMe has children and the -recurse parameter was not
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 C:\temp\DeleteMe -Recurse

對應本機資料夾做為 Windows 可存取的磁碟機

您也可以使用 subst 命令對應本機資料夾。下列命令建立本機磁碟機 P:,並將其根目錄指定為本機 Program Files 目錄:

subst p: $env:programfiles

就像網路磁碟機一樣,在 Windows PowerShell 中由 subst 建立對應的磁碟機立即可供 Windows PowerShell 殼層使用。

將文字檔讀入陣列

文字資料最常用的儲存格式是存入檔案,其中每一行視為不同的資料元素。Get-Content Cmdlet 可用於透過單一步驟讀取整個檔案,如下所示:

PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
 /noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional 
with Data Execution Prevention" /noexecute=optin /fastdetect

Get-Content 已將讀取自檔案的資料視為陣列,每個元素各代表一行檔案內容。這可藉由檢查所傳回內容的 Length 獲得證實:

PS> (Get-Content -Path C:\boot.ini).Length
6

此命令最適合用來取得資訊清單後直接讀入 Windows PowerShell。例如,假設您將電腦名稱或 IP 位址清單儲存在 C:\temp\domainMembers.txt 檔案中,每個名稱各佔一行檔案內容。這時您就可以使用 Get-Content 擷取檔案內容,然後儲存至 $Computers 變數:

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

$Computers 如今即為陣列,每個元素都代表一個電腦名稱。




目錄