1. 程式人生 > >PowerShell Function之獲取OS資訊

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很醜,這個不在本章節的探討範圍之內。後續會寫上如何優化我們的輸出。

相關推薦

PowerShell Function獲取OS資訊

我想寫一個Function系列,把常用的獲取資訊的語句寫成一個又一個的Function,也方便後面寫PowerShell生成Html系列文章時,直接採取以寫好的Function來呼叫就好了。 最熟悉不

小白學python獲取物件資訊_學習筆記

本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。 本文是學習到python的獲取物件資訊。參考連結廖雪峰python獲取物件資訊。 使用type() print(type(123)) print(type('str')) print(type(

shell獲取終端資訊

#!/bin/bash #tput和stty是兩款終端處理工具 #獲取列數和行數 tput cols tput lines #列印當前終端名 tput longname #移動游標 移動游標到100 100 tput cup 100 100 #設定終端背景色 0-7 tput setb 0 #設定終端前景色

Ajax小案例獲取後臺資訊顯示

知識點:資料傳輸--------json jquery----------- . a j

微信小程式獲取使用者資訊介面優化調整

突然收到這個訊息的我是懵逼的,因為這意味著我要改需求! 新的處理方式就是 我的做法是做一個緩衝載入頁,然後通過wx.getUserInfo獲取使用者資訊,如果已經授權過了,那麼是可以獲取資訊的

Qt學習獲取檔案資訊

QFileInfo類提供了對檔案進行操作時獲取的檔案資訊,包括檔名, 檔案大小(位元組), 檔案建立時間, 檔案最後修改時間,檔案最近訪問時間以及一些檔案是否為目錄,檔案,或者符號連線,和讀寫等屬性。 不廢話了,先看看程式碼~~~~ fileInfo_widget.h

Android官方開發文件Training系列課程中文版:分享檔案獲取檔案資訊

之前的課程講述了客戶端APP試圖與含有檔案的URI一同執行,APP可以請求服務端APP的檔案資訊,包括檔案的資料型別以及檔案的大小。這些資料型別可以幫助客戶端APP來判斷該檔案是否可以處理,檔案的大小可以幫助客戶端APP對該檔案設定相應大小的緩衝區。 這節

C#開發BIMFACE系列6 服務端API獲取檔案資訊

在《C#開發BIMFACE系列4 服務端API之源上傳檔案》、《C#開發BIMFACE系列5 服務端API之檔案直傳》兩篇文章中詳細介紹瞭如何將本地檔案上傳到BIMFACE伺服器及BIMFACE後臺的分散式儲存系統中。檔案上傳成功後,BIMFACE的服務會返回與該檔案相關的資訊,如下圖:  開

Java架構-(十三) 整合spring cloud雲架構 - SSO單點登入OAuth2.0 根據token獲取使用者資訊(4)

上一篇我根據框架中OAuth2.0的使用總結,畫了SSO單點登入之OAuth2.0 登出流程,今天我們看一下根據使用者token獲取yoghurt資訊的流程: Java程式碼 我這裡只是簡單寫了一些登出的程式碼,我們會在後面的文章中詳細貼出所有程式碼供大家參考,而且會從建立

Android開發獲取SIM卡資訊和手機號碼

獲取SIM卡資訊和手機號碼的工具類,記錄一下方便以後使用 import android.content.Context; import android.telephony.TelephonyManager; /** * Created by WangJinyong on 20

關於Android中獲取資訊

通過第一部分<<Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)>>的介紹,對PackageManager以及 AndroidManife.xml定義的節點資訊類XXXInfo類都有了一定的認識。   

(十三)Java springcloud B2B2C o2o多使用者商城 springcloud架構 - SSO單點登入OAuth2.0 根據token獲取使用者資訊(4)

上一篇我根據框架中OAuth2.0的使用總結,畫了SSO單點登入之OAuth2.0 登出流程,今天我們看一下根據使用者token獲取yoghurt資訊的流程: /** * 根據token獲取使用者資訊 * @param accessToken * @return * @

(十三)java springboot b2b2c多使用者商城系統分析 - SSO單點登入OAuth2.0 根據token獲取使用者資訊(4)

上一篇我根據框架中OAuth2.0的使用總結,畫了SSO單點登入之OAuth2.0 登出流程,今天我們看一下根據使用者token獲取yoghurt資訊的流程: ​ /** * 根據token獲取使用者資訊 * @param accessToken * @return * @

Android開發獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

(十三)Java B2B2C o2o多使用者商城 springcloud架構 - SSO單點登入OAuth2.0 根據token獲取使用者資訊(4)

上一篇我根據框架中OAuth2.0的使用總結,畫了SSO單點登入之OAuth2.0 登出流程,今天我們看一下根據使用者token獲取yoghurt資訊的流程:   /** * 根據token獲取使用者資訊 * @param accessToken * @

AOP獲取Controller請求(Request)、返回(Response)引數、報錯資訊實現日誌記錄

需求:為系統中所有的提交,修改,刪除等等操作(除查詢以外的所有操作)做日誌記錄,記錄的內容包括:請求引數,返回引數,如果報錯就儲存報錯資訊。日誌要新增一個日誌型別。 方案:最好的選擇就是用註解標記切點,用AOP實現此需求。 一、準備 版本: J

Qt總結二:遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(二)

前言 需要在特定目錄或磁碟下查詢特定檔案 一、篩選目錄 (一)單一目錄下遍歷,篩選特定檔案 QDir dir("./SaveFiles"); QFileInfoList list = dir.entryInfoList(); (二)裝置所有磁碟中遍歷 QF

Eureka原始碼分析Eureka Client獲取例項資訊流程

下方是Eureka Client從Eureka Server獲取例項資訊的總體流程圖,後面會詳細介紹每個步驟。 Eureka Client在剛啟動的時候會從Eureka Server全量獲取一次註冊資訊,同時初始化Eureka Client本地例項資訊快取定時更新任務,預設30s一次

獲取數字證書相關資訊,證書有效性驗證,RSA加密和解密功能獲取證書相關資訊

//公鑰 private PublicKey pk; /** 後臺將證書以byte陣列的形式傳入 * @param bytes,數字證書crt傳入的byte陣列 * @return */ public InfoEntity getCertificateInfo(

微信小程式使用者登入(獲取使用者資訊,openid,unionld) java後臺版

參考文章:https://blog.csdn.net/guochanof/article/details/80189935;感謝作者給的思路與大部分問題解決辦法由於微信官方api的更改,wx.getuserinfo()方法無法在無授權的情況下直接使用,參考文中作者是直接可以拉