PowerShell Function之獲取OS信息

我想寫一個Function系列,把常用的獲取信息的語句寫成一個又一個的Function,也方便後面寫PowerShell生成Html系列文章時,直接採取以寫好的Function來調用就好了。

最熟悉不過的就是獲取OS信息啦,那麼也就從這個開始寫吧。

說明,獲取計算機信息可以使用Get-ADComputer,但我在本系列文章將採用Get-WmiObject來獲取相關信息。說明一下,Get-WmiObject在powershell 3.0以後就逐漸被Get-CimInstance取代了。不過Get-WmiObject在powershell 3.0及以後的版本還是可以運行的,只不過Get-CimInstance執行的結果只是名副其實的Instance,沒有包含任何方法信息。

想了下,應該是直接上腳本呢,還是寫個過程引導讀者如何寫出最終的腳本。考慮到這一系列的文章適合小白閱讀,那麼還是將整個過程簡單寫出來會更好些。

1. 確定合適的class

WMI的類有很多,到底哪個class纔會提供OS的信息給我們呢?等等,OS是什麼的簡寫?OperatingSystem!因此你是不是應該想到這個class的名稱應該爲Win32_OperatingSystem呢?當然,作爲小白的話,可能你都不確定這個class是否存在,那麼則可以運行以下腳本來獲取到所有的class(在PowerShell介紹第六回有提到過).
$i=0 
$Type = "Win32" 
$WMI = Get-WmiObject -List | Where-Object {$_.name -Match $Type}
Foreach ($Class in $WMI) {$Class.name | out-file –filepath e:\win32.csv -append; $i++}
確定了合適的class,第一條句子應該就已經會寫了:
$OS = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName
先在PS上運行下,看看得出來的都是一些什麼信息。

是不是發現了上面好像缺了一些我們想要的信息,對吧。難道只能獲取到這麼點信息麼?不可能吧!
那麼,應該怎麼查看是否還能獲取到其他信息?添加個| FL沒用!
應該使用Get-CimInstance Win32_OperatingSystem | select -ExpandProperty CimInstanceProperties | fl *
運行結果一看,不要太激動!是不是看到了你想要的信息了,例如系統版本,安裝時間等等幾十種信息!
 

2. 自定義輸出屬性

用上面的命令可以獲取到OS的幾十種屬性,那麼,我應該如何選擇我需要輸出的屬性呢?方法也很簡單。最簡單的就是直接select,想要輸出什麼屬性就select的什麼。但是在此我想介紹另外一種更高級的方法,通過創建數組來定義輸出的屬性。
$os = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName
$props = @{'OSVersion'=$os.version;
'Manufacturer'=$os.Manufacturer;
'OperatingSystem'=$os.Caption;
'InstallDate'=$os.InstallDate}
New-Object -TypeName PSObject -Property $props
但是這裏還有點美中不足的就是$os.InstallDate出來的格式不是我們想要的,那麼又應該如何轉換成我們想要的時間格式呢?

此時應該隆重介紹ConvertToDateTime()出場啦!使用ConvertToDateTime()可以將日期和時間的指定字符串表示形式轉換爲等效的日期和時間值。
$osInstallDate=$osInstallDate=$os.ConvertToDateTime($os.InstallDate)
但這樣的顯示結果往往還不是我們想要的,在腳本中多數看到的格式都是yyyyMMdd這些類型個格式,那麼又應該如何轉換呢?此時應該再介紹一個好東西ToString
$osInstallDates = $osInstallDate.ToString("yyyy-MM-dd HH:mm:ss")
輸出效果如下:


那麼此時,應該優化我們都的腳本啦!
$os = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName;
$osInstallDate=$os.ConvertToDateTime($os.InstallDate);
$osInstallDates = $osInstallDate.ToString("yyyyMMdd");
$props = @{'OSVersion'=$os.version;
'Manufacturer'=$os.Manufacturer;
'OperatingSystem'=$os.Caption;
'InstallDate'=$osInstallDates;
}
New-Object -TypeName PSObject -Property $props
運行結果如下:


是不是很有成就感呢!哎呀,是不是又覺得我們跑題了,說好的function呢?別急,接下來我們就優化腳本成一個function吧!

3. 編寫Function函數

此時應該再複習一下function的語法哈!
function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]
          {
              param([type]$parameter1 [,[type]$parameter2])
          }
說明:
函數中包含以下各項:
- 一個 Function 關鍵字
- 一個作用域(可選)
- 一個由您選擇的名稱
- 任意數目的命名參數(可選)
- 括在大括號 ({}) 內的一條或多條 Windows PowerShell 命令
function Get-InfoOS {
$os = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName;
$osInstallDate=$os.ConvertToDateTime($os.InstallDate);
$osInstallDates = $osInstallDate.ToString("yyyy-MM-dd HH:mm:ss");
$props = @{'OSVersion'=$os.version;
'Manufacturer'=$os.Manufacturer;
'OperatingSystem'=$os.Caption;
'InstallDate'=$osInstallDates;
}
New-Object -TypeName PSObject -Property $props
}
是不是很簡單?運行下試試?

再繼續玩點高級的,定義個可輸入的參數如何?

4.定義接受輸入的參數

就是前面提到的param啦,直接上腳本,不清楚的童鞋可以複習之前的文章!
function Get-InfoOS {
[CmdletBinding()]
param(
[Parameter(Mandatory=$True)][string]$ComputerName
)
$os = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName;
$osInstallDate=$os.ConvertToDateTime($os.InstallDate);
$osInstallDates = $osInstallDate.ToString("yyyy-MM-dd HH:mm:ss");
$props = @{'OSVersion'=$os.version;
'Manufacturer'=$os.Manufacturer;
'OperatingSystem'=$os.Caption;
'InstallDate'=$osInstallDates;
}
New-Object -TypeName PSObject -Property $props
}


是否還有童鞋說,我有很多計算機啊,我不想手動敲進去啊,我可以準備個list,能不能讀取list清單就好了呢?當然沒問題啦!

5. Import 計算機清單

可以通過import-CSV和get-content來實現上面的需求,但是我個人比較喜歡使用import-CSV
function Get-InfoOS {
[CmdletBinding()]
param(
[Parameter(Mandatory=$True)][string]$FilePath
)
$Check_Day = (Get-Date).ToString("yyyyMMdd");
$servers = import-csv .\serverlist.txt;
$Output_file_OSInfo = ".\OSInfo$Check_Day.html";
Foreach ($server in $Servers)
{
$ComputerName = $server.server;
$os = Get-WmiObject -class Win32_OperatingSystem -ComputerName $ComputerName;
$osInstallDate=$os.ConvertToDateTime($os.InstallDate);
$osInstallDates = $osInstallDate.ToString("yyyy-MM-dd HH:mm:ss");
$props = @{'OSVersion'=$os.version;
'Manufacturer'=$os.Manufacturer;
'OperatingSystem'=$os.Caption;
'InstallDate'=$osInstallDates;
}
$OSInfo=New-Object -TypeName PSObject -Property $props;
$ComputerName,$OSInfo | Out-File $output_file_OSInfo -Append -Encoding UTF8
}
}
雖然輸出的html很醜,這個不在本章節的探討範圍之內。後續會寫上如何優化我們的輸出。
發佈了46 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章