瀏覽 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 可透過 Path、Filter、Include 和 Exclude 參數來篩選項目,但這些參數通常都是依名稱篩選。使用 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 如今即為陣列,每個元素都代表一個電腦名稱。