這次將分享如何使用 Windows PowerShell 對檔案與資料夾進行操作處理。
強而有力的 Windows PowerShell 系列文章列表如下:
http://ithelp.ithome.com.tw/event/ironmanarticle2/id/20005121
在 Windows PowerShell 中,瀏覽磁碟機以及操控這些磁碟機上的項目,就跟使用檔案總管操控 Windows 實體磁碟機上的檔案和資料夾是類似的行為,只是一個要透過腳本,一個則是透過滑鼠。
使用 Get-ChildItem 可取得資料夾目前所在之當層目錄中所有的項目,亦即該資料夾內所有的檔案和子資料夾。加上選擇性 Force 參數則可顯示檔案屬性是隱藏或系統的項目。若要顯示更內層所包含的項目,必須一併指定 Recurse 參數。例如,下面的命令會顯示 Windows PowerShell 磁碟機 C(等同於 Windows 實體磁碟機 C)根目錄的內容:
Get-ChildItem -Force C:\ -Recurse | Out-Host -Paging
Get-ChildItem 提供 Path、Filter、Include 和 Exclude 等參數來篩選項目,而這些參數通常都是依照名稱進行篩選的。因此通常都會搭配 Where-Object cmdlet,因為它可以依照項目的其他屬性,來進行複雜的篩選作業。
例如,使用下面的指令可以找出 Program Files 資料夾內,上次修改日期是在 2009 年 4 月 10 日以後,且大小介於 2 MB 到 15 MB 之間的所有 .exe 可執行檔:
$strInclude = "*.exe"
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include $strInclude |`
Where-Object -FilterScript {`
($_.LastWriteTime -gt "2009-4-10") -and ($_.Length -ge 2MB) -and ($_.Length -le 15mb)} |`
Format-Table Name, @{Label="Mbytes";Expression={ "{0:N2}" -f ($_.Length / 1Mb) }}, `
LastWriteTime, CreationTime, Mode -AutoSize |`
Out-Host -Paging
現在來解說一下程式碼中的兩個關鍵指令。
如同在 DOS 環境下一樣,在 Windows PowerShell 中也提供存取 Windows 環境變數的功能,以程式碼中的 $env:ProgramFiles 來說,就是顯示Program Files 環境變數的值。如果要顯示 WINDIR 環境變數的值,可在 Windows PowerShell 命令提示字元下,輸入下列命令:
$env:windir
@{Name="Mbytes";Expression={ "{0:N2}" -f ($_.Length / 1Mb) }} 是用來計算以 MB 為單位的檔案大小。在大括弧內,我們指定雜湊表的兩個元素:屬性 Label(在此是顯示成 Mbytes)與屬性 Expression(也就是將用來計算屬性值的指令碼區塊,在此是以將其大小除以 1MB,簡單地說,就是用 MB 為單位來顯示其大小,而 N2 是表示顯示到小數點之後 2 位)。關於雜湊表的說明,可以看之前分享的「Windows PowerShell 基本操作 - 將執行的結果格式化」。