哈哈,昨天弄了個ubuntu 11.10在虛擬機上運行,發現11.10界面非常絢麗,但是其需要的系統資源非常多,我虛擬機設定內存為512M,1個CPU4個核心,
進入以后發現根本動不了,因此今天我就下載了一個Fedora Core 4的版本來用,發現還是Redhat的東西熟悉啊。下面上張虛擬機的圖片大家看看。

???? 上次我們說到了,wmi對象和com組件,今天我們繼續來看PS中對象的相關內容。主要說一下靜態對象和對象的基本操作。
一、靜態對象
???? 在PS中有一類特殊的對象,我們不能同過這些類創建新的對象,這些類是不能更改狀態的方法和屬性的引用庫。無法創建這些類,僅可以使用它。因為
不能創建、銷毀或更改這些類和方法,因此也將這些類叫做靜態類。
1、1 system.environment 靜態類
???? 在PS中經常用到的靜態類有system.environmet類。例如我們可以在PS中查看這些類:
Exp:在PS中查看system.environment類
PS C:\Users\vol_20120330> [system.environment]IsPublic IsSerial Name???????????????????????????????????? BaseType?????????????????????? -------- -------- ----???????????????????????????????????? --------?????????????????????? True???? False??? Environment????????????????????????????? System.Object ?? |
???? 如上圖所示,我們查看了system.environment,類的信息,可以看出來system.environment,繼承于system.object類。 這里還有一點需要注意的
那就是引用靜態類的時候,要用“[]”,表示引用的是靜態類。
1、2 利用get-member函數是static參數獲取靜態類成員
???? 我們可以通過get-member命令來查看靜態類的成員。
Exp:查看靜態類的成員
PS C:\Users\vol_20120330> [system.environment] | get-member ?? TypeName: System.RuntimeType Name?????????????????????????? MemberType Definition???????????????????????????????????? ----?????????????????????????? ---------- ----------???????????????????????????????????? Clone????????????????????????? Method???? System.Object Clone()????????????????????????? Equals???????????????????????? Method???? bool Equals(System.Object obj), bool Equals(... FindInterfaces????????????? Method???? type[] FindInterfaces(System.Reflection.Type... |
???? 可以發現,這個通過get-member獲取的類型是:system.runtimetype;與原來的類型不一致,這是為什么呢? 前面說過了,靜態類與其他的類在行為和
方式上不同。在使用get-member命令獲取靜態類的信息的時候,需要附加-static參數。
Exp:
PS C:\Users\vol_20120330> [system.environment] | get-member? -static ?? TypeName: System.Environment Name?????????????????????? MemberType Definition???????????????????????????????????????? ----?????????????????????? ---------- ----------???????????????????????????????????????? Equals???????????????????? Method???? static bool Equals(System.Object objA, System.Ob... Exit?????????????????????? Method???? static System.Void Exit(int exitCode)????????????? ExpandEnvironmentVariables Method???? static string ExpandEnvironmentVariables(string ... FailFast?????????????????? Method???? static System.Void FailFast(string message)??????? GetCommandLineArgs???????? Method???? static string[] GetCommandLineArgs()?????????????? GetEnvironmentVariable???? Method???? static string GetEnvironmentVariable(string vari... GetEnvironmentVariables??? Method???? static System.Collections.IDictionary GetEnviron... GetFolderPath????????????? Method???? static string GetFolderPath(System.Environment+S... GetLogicalDrives?????????? Method???? static string[] GetLogicalDrives()???????????????? ReferenceEquals??????????? Method???? static bool ReferenceEquals(System.Object objA, ... SetEnvironmentVariable???? Method???? static System.Void SetEnvironmentVariable(string... CommandLine??????????????? Property?? static System.String CommandLine {get;}??????????? CurrentDirectory?????????? Property?? static System.String CurrentDirectory {get;set;}?? ExitCode?????????????????? Property?? static System.Int32 ExitCode {get;set;}??????????? HasShutdownStarted???????? Property?? static System.Boolean HasShutdownStarted {get;}??? MachineName??????????????? Property?? static System.String MachineName {get;}??????????? NewLine??????????????????? Property?? static System.String NewLine {get;}??????????????? OSVersion????????????????? Property?? static System.OperatingSystem OSVersion {g |
?????? 可以發現這里對象的類型變成了system.environmet.?? 還可以通過指定membertype參數來分類獲取靜態類的屬性和方法。
命令分別為:
[system.environment] | get-member? -membertype? property???? # 獲取屬性
[system.environment] | get-member? -membertype? method???????? # 獲取方法
我們試一下是否可以用new-object創建靜態對象。
Exp:
PS C:\Users\vol_20120330> new-object?? system.environment New-Object : 找不到構造函數。無法找到適合類型 system.environment 的構造函數。 所在位置 行:1 字符: 11 + new-object <<<<??? system.environment ??? + CategoryInfo????????? : ObjectNotFound: (:) [New-Object], PSArgumentException ??? + FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.Ne ?? wObjectCommand |
???? 可以發現,靜態類沒有構造函數,因此靜態函數僅僅是一個庫,可以使用的庫,不能通過它來派生新的的類和構造類的對象。
1、3? 引用靜態類的成員
???? 在PS中通過全局引用符 " :: "來引用靜態類的成員。
Exp:
PS C:\Users\vol_20120330> [system.environment]::commandline "C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe" |
???? 如圖所示,我們利用commandline獲取了PS的安裝路徑。還可以通過OsVersion屬性獲取系統的版本信息
Exp:
PS C:\Users\vol_20120330> [system.environment]::osversion ????????????? Platform ServicePack??????????? Version?????????????? VersionString??????? ????????????? -------- -----------??????????? -------?????????????? -------------??????? ?????????????? Win32NT Service Pack 1???????? 6.1.7601.65536??????? Microsoft Windows ... |
1、4 system.math 類進行數學運算????
????? 在PS中還提供了另外一個靜態類, system.math. 同樣可以通過get-member命令獲取system的成員。
Exp:
PS C:\Users\vol_20120330> [system.math] | get-member -static? -membertype method ?? TypeName: System.Math Name??????????? MemberType Definition??????????????????????????????????????????????????? ----??????????? ---------- ----------??????????????????????????????????????????????????? Abs???????????? Method???? static System.SByte Abs(System.SByte value), static System.... Acos??????????? Method???? static double Acos(double d)????????????????????????????????? Asin??????????? Method???? static double Asin(double d)????????????????????????????????? Atan??????????? Method???? static double Atan(double d)????????????????????????????????? Atan2?????????? Method???? static double Atan2(double y, double x)?????????????????????? BigMul????????? Method???? static long BigMul(int a, int b)????????????????????????????? Ceiling???????? Method???? static decimal Ceiling(decimal d), static double Ceiling(do... Cos???????????? Method???? static double Cos(double d)?????????????????????????????????? Cosh??????????? Method???? static double Cosh(double value)????????????????????????????? DivRem????????? Method???? static int DivRem(int a, int b, System.Int32&, mscorlib, Ve... Equals????????? Method???? static bool Equals(System.Object objA, System.Object objB)??? Exp???????????? Method???? static double Exp(double d)?????????????????????????????????? Floor?????????? Method???? static decimal Floor(decimal d), static double Floor(double d) IEEERemainder?? Method???? static double IEEERemainder(double x, double y)?????????????? Log???????????? Method???? static double Log(double d), static double Log(double a, do... Log10?????????? Method???? static double Log10(double d)???????????????????????????????? Max???????????? Method???? static System.SByte Max(System.SByte val1, System.SByte val... Min???????????? Method???? static System.SByte Min(System.SByte val1, System.SByte val... Pow???????????? Method???? static double Pow(double x, double y)???????????????????????? ReferenceEquals Method???? static bool ReferenceEquals(System.Object objA, System.Obje... Round?????????? Method???? static double Round(double a), static double Round(double v... Sign??????????? Method???? static int Sign(System.SByte value), static int Sign(System... Sin???????????? Method???? static double Sin(double a)?????????????????????????????????? Sinh??????????? Method???? static double Sinh(double value)????????????????????????????? Sqrt??????????? Method???? static double Sqrt(double d)????????????????????????????????? Tan???????????? Method???? static double Tan(double a)?????????????????????????????????? Tanh??????????? Method???? static double Tanh(double value)????????????????????????????? Truncate??????? Method???? static decimal Truncate(decimal d), static double Truncate(... |
????? 這些方法可以實現一定的數學運算功能,上面的幫助信息已經給出了函數的定義。舉個例子:
Abs???????????? Method???? static System.SByte Abs(System.SByte value), static System....
????? 上面的命令可以獲取一個實數的絕對值,其用法如下:??? [system.math]::abs(x);
?
2、 管道對象管理
?????? 執行cmdlet時,在管道中傳遞的對象比我們實際需要的要多,而且有時候我們并不需要關注這么多的對象,那么我們是否可以對這些對象進行一下
篩選呢?
??????? 在PS中我們可以使用where-object命令進行篩選。
2、1 where-object命令
??? 利用where-object命令可以逐一的測試管道中傳遞的對象,并將符合篩選條件的對象在管道中進行傳遞,而將不符合條件的對象從管道中刪除;實現
這一功能需要使用where-object的FilterScript表達式特性。
??? FiltrScript表達式為返回值為true或者false的腳本塊; 腳本塊是有{} 括起來的一個或者多個PS命令,這些腳本簡單而功能強大。使用這些腳本需要
使用PS提供的另外一個特性:比較運算符。
?? 在PS中,比較運算符不區分大小寫,因為在PS中 小于(<)、大于(>) 、等于(=)因為有特殊的用途,因此用字母token表示。基本的運算符有:
??比較運算符???????????????? 含義???????? 實例(返回TRUE)
??? -eq??????????????????????? 等于???????????? 1 –eq? 1
??? -ne?????????????????????? 不等于?????????? 1 –ne?? 2
??? -lt???????????????????????? 小于????????????? 1 –lt?? 2
??? -le??????????????????????? 小于或等于????? 1 –le??? 2
???? -gt?????????????????????? 大于????????????? 2 –gt? 1
???? -ge?????????????????????? 大于等于??????? 2 –ge?? 1
??? -like??????????????????????? 類似需要用???? "file.doc"? -like??? "f*.do?"
????????????????????????????????? 文本通配符
???? -notlike?????????????????? 不類似?????????? "file.doc"? -notlike? "p*.doc"
???? -contains??????????????? 包含????????????? 1,2,3? -contains?? 1
???? -notcontains?????????? 不包含??????????? 1,2,3? -notcontains?? 4
?
????? 在PS中為了遍歷管道中的對象,提供了一個預置的變量: $_? ;通過這個對象可以遍歷管道中傳遞的對象。
Exp: 利用FilterScript進行篩選
PS C:\Users\vol_20120330> 1,2,3,4,5 | where-object? -filterscript {$_? -lt? 3} 1 2 |
???? 我們還可以根據對象的屬性進行篩選。例如我們要查看WMI中win32_systemdriver類,在系統中可能有幾百個這樣的系統驅動程序,而我們可能
只對其中的一部分感興趣,這樣我們就可以通過FilterScript來獲取我們感興趣的驅動類。
Exp: 利用FilterScript表達式獲取win32_systemdriver中正在運行的類
PS C:\Users\vol_20120330> get-wmiobject -class? win32_systemdriver? | where-object? -filterscript {$_.state -eq "running"} DisplayName : Microsoft ACPI Driver Name??????? : ACPI State?????? : Running Status????? : OK Started???? : True DisplayName : Ancillary Function Driver for Winsock Name??????? : AFD State?????? : Running Status????? : OK Started???? : True DisplayName : amdxata Name??????? : amdxata State?????? : Running Status????? : OK Started???? : True DisplayName : IDE 通道 Name??????? : atapi State?????? : Running Status????? : OK Started???? : True |
???? 我們還可以通過這樣的方式,獲取啟動模式為手動的驅動程序:
PS C:\Users\vol_20120330> get-wmiobject -class? win32_systemdriver? | where-object? -filterscript {$_.startmode -eq "manual"} DisplayName : 1394 OHCI Compliant Host Controller Name??????? : 1394ohci State?????? : Stopped Status????? : OK Started???? : False DisplayName : ACPI Power Meter Driver Name??????? : AcpiPmi State?????? : Stopped Status????? : OK Started???? : False DisplayName : adp94xx Name??????? : adp94xx State?????? : Stopped Status????? : OK Started???? : False DisplayName : adpahci Name??????? : adpahci State?????? : Stopped Status????? : OK Started???? : False |
???? 如果我們需要同時獲取“正在運行”而且是啟動模式為“手動啟動”的驅動程序我們怎么辦呢?方法1是組合管道命令,如下所示:
PS C:\Users\vol_20120330> get-wmiobject -class? win32_systemdriver? | where-object? -filterscript {$_.startmode -eq "manual"} | where-object? -filterscript {$_.startmode -eq "manual"} DisplayName : 1394 OHCI Compliant Host Controller Name??????? : 1394ohci State?????? : Stopped Status????? : OK Started???? : False DisplayName : ACPI Power Meter Driver Name??????? : AcpiPmi State?????? : Stopped Status????? : OK Started???? : False DisplayName : adp94xx Name??????? : adp94xx State?????? : Stopped Status????? : OK Started???? : False |
??? 這樣做的話,輸入的命令太長,在Ps中還提供了一套邏輯運算的機制,使用邏輯運算機制就可以使前面的命令變短.
Exp:
PS C:\Users\vol_20120330> get-wmiobject -class? win32_systemdriver? | where-object? -filterscript {$_.startmode -eq "manual"? -and $_.startmode -eq "manual"} DisplayName : 1394 OHCI Compliant Host Controller Name??????? : 1394ohci State?????? : Stopped Status????? : OK Started???? : False DisplayName : ACPI Power Meter Driver Name??????? : AcpiPmi State?????? : Stopped Status????? : OK Started???? : False DisplayName : adp94xx Name??????? : adp94xx State?????? : Stopped Status????? : OK Started???? : False |
???? PS中的邏輯運算符有:?? -and、 -or、-not 、!; 分別是與、或、非(其中 ! 也是表示非)。
?
三、小結
???? 在PS中通過使用這些特性,就可以編寫復雜的管理程序了。
???? 第一次用LiveWrite,感覺與網頁的方式區別挺大的,首先是Tab鍵沒有很好的支持,再次就是貼代碼不是很方便,需要改進。
? 而且排好的格式,傳上來后有點不一致。
?
待續………..