PowerShell 2.0 實踐(二)操作文件系統(續)
上一次我們練習了基本的文件系統操作方法,包括創建、復制、移動(剪切)、重命名、刪除文件和目錄的方法,非常常用。本次我們繼續來探討文件系統,本次來關注一下這些命令:
Get-ChildItem
Add-Content
Clear-Content
Get-Content
Set-Content
Out-File
Select-String
本系列所有腳本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64 中測試通過。
- 獲取本機運行的進程、服務,寫入到一個文本文件,并讀取其中的內容:
#在指定目錄下面創建一個文本文件:SP.txt
New-Item -ItemType File -Path E:\PSTest\SP.txt -Force
#將本機運行的所有進程信息寫入該文件
Get-Process | Out-File -FilePath E:\PSTest\SP.txt -Force
#將本機運行的所有服務信息追加進該文件
Get-Service | Out-File -FilePath E:\PSTest\SP.txt -Append -Force
#讀取文件的內容
Get-Content -Path E:\PSTest\SP.txt
#打開該文件
Invoke-Item -Path E:\PSTest\SP.txt
SP.txt的文件內容如下所示(取決于你電腦上的進程與服務):
- 獲取TEMP中的所有文本文件:
#遞歸獲取%TEMP%中的所有文件
$files = Get-ChildItem -Recurse $Env:TEMP | Where {!$_.PSIsContainer}
foreach($file in $files)
{
#如果是文本文件,則輸出文件名與文件大小
if($file.Extension.ToLower() -eq ".txt")
{
Write-Host $file.Name $file.Length
}
}
$Env:是PowerShell的內置變量,表示系統環境變量,"$_"也是內置變量,作用類似于"this",表示當前管道對象的實例,PSIsContainer表示容器,在這里判斷是否為目錄。-Recurse遞歸獲取TEMP目錄及其所有子目錄中的所有文件。
- 獲取當前系統中所有的PowerShell驅動器,并寫入csv文件,最后調用Excel打開該文件:
Get-PSDrive | Get-Member
if(Test-Path -Path E:\PSTest)
{
Get-PSDrive | Export-Csv -Path E:\PSTest\SP.csv
Import-Csv -Path E:\PSTest\SP.csv | select Name, Root, Free, Used | Format-Table -AutoSize
Invoke-Item E:\PSTest\SP.csv
}
Get-Member可以獲取一個對象的所有成員,包括.NET屬性、方法等,如果對一個命令的類型及其包含成員不熟悉,可以用這個命令來查看。
Test-Path會判斷所給路徑是否存在,存在返回 true,不存在返回 false。
執行結果如下:
這樣我們就知道了可以在select語句中查詢哪些,Import-Csv相當于"Get-Content"csv文件,即獲取csv文件的內容。
Invoke-Item csv文件會調用csv的默認文件:Excel來打開:
4、搜索PowerShell安裝目錄下的所有擴展名為".ps1xml"且內容包含"EventType"的文件:
Select-String -Path $pshome\*.ps1xml -Pattern "EventType" –SimpleMatch
還可以使用正則表達式:
Select-String -Path "H:\Virtual Machines\ESX Server 4.1\*.log" -Pattern "\w+P\w?" –CaseSensitive
使用-CaseSensitive表示區分大小寫,注意若路徑中包含空格,則用雙引號或單引號括起來。盡量搜索基于文本類型的文件(.txt、.xml、.sql等),若搜索dll、圖片等則會得到亂碼。
若只是搜索文件,可以用Get-ChildItem。
遞歸搜索JAVA_HOME環境變量目錄下的所有jar包:
Get-ChildItem -Path $Env:JAVA_HOME -Filter "*.jar" –Recurse
還可以搜索網絡上的共享驅動器。
我將虛擬機中的一個磁盤設為了共享:
Get-ChildItem \\192.168.200.132\c\FileTest -Filter "*.txt" -Recurse
這點還是很方便的,尤其在局域網環境下,可以隨意搜索FTP等共享文件夾。
小結:
本次我們使用了一些高級命令來操作文件系統,這些命令之間相互組合可以完成常見的任務。至此我們對文件系統就有了一個大體的認識,可以看到,使用PowerShell可以很方便快捷的操作文件系統,借助于.NET的類庫,可以寫出邏輯更為復雜的命令,來完成一些特殊需求。為了照顧熟悉DOS、Linux、Unix的用戶,PowerShell也提供了一些命令的別名,如cd、mkdir、ls等,可以使其他管理員快速入門。后續篇章將繼續關注PowerShell在其他領域的用法,如注冊表操作、驅動器操作、AD等。

浙公網安備 33010602011771號