只要有想见面的人,自己就不再是孤单一人。 收藏本站
登陆 / 注册 搜索

阅读: 5K   回复: 3

[# 系统基础] PowerShell入门(九):访问.Net程序集、COM和WMI(转)

soarcloud 「龙战于野」 2016-8-2 15:29 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑
. _  I3 J) y+ M  v4 Z0 m8 J
4 b# V% K7 y. S4 j* ~& u  G  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。3 u! U6 ]/ O/ _6 K7 H+ a9 G% M
( g0 e9 W- I$ [3 |- j6 {9 u" K
与新锐.Net联姻  m# W0 \" }7 u+ ?# L
  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:2 \" y0 V! j; A: e8 M

8 w2 i0 B% w2 ^& ]/ g. G5 t复制代码# i4 T$ j, x, M
Add-Type -AssemblyName mscorlib
9 w7 J  E: l7 O$str = New-Object System.Text.StringBuilder. ]; x3 k4 v! [% n% E( P0 F
$str.Append("Hello")
3 t; d1 s. W& p. n5 I* [( z0 U$str.ToString()+ \# t) V0 f/ ]! P0 T2 t( ]
复制代码0 M9 \, w; I! i- G
其结果是输出Hello字符串。8 z  ~4 K. C7 p5 x+ o. J& n9 B
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:
$ C8 G* G: h: i首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。
5 f: D) V' U2 S+ P; k# U6 H复制代码% K$ ]" w/ \- x  d
using System;. t4 K6 ~2 A" z: Q( V: d
namespace PowerShellDemo6 |$ u& C3 e+ A2 N! n- \; u8 }* f! ~
{3 Q' a0 O  A2 p8 V8 p! q8 _, g
    public class PowerShellDemo
5 b0 n, |4 C/ e8 j    {
  o: l/ g; O4 o        public void Greet()
% Y0 k9 Q3 N+ Y        {
, D: c* i8 t* T( V3 A! B  _6 P& m            Console.WriteLine("Hello!");
2 E! j  v. _" ~. L/ b        }+ W3 ], j# s" t/ |- G0 X5 b
    }& u+ c4 s, X5 h3 W) x$ |
}
7 F/ i6 h) B3 H" s1 ]复制代码
* E# X8 t: ?" q/ A5 o4 N( }: F然后将其导入到PowerShell会话中,并使用其函数或者属性。
' p7 M/ k; z( i) }+ gAdd-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”
: v7 p5 h& v& @' L) p$obj = New-Object PowerShellDemo.PowerShellDemo* p; b: [0 b7 E( x8 k$ ]& i5 i
$obj.Greet()
4 ~+ A# {# l; b* O以上调用的输出是Hello字符串.9 W' u6 G0 v9 t0 C/ h
  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。
  M+ ^& M/ S% ~. B" P* F0 Z. p, d与贵族COM为伍
/ O. p5 z9 d) [/ H2 l/ \# q( PCOM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:
  \( {0 Y. o) [/ Q复制代码* a, p8 y0 m+ m  q& u
$ie = New-Object -ComObject InternetExplorer.Application
, J! k; ~2 m! j% @$ie.Visible = $true1 X: o1 R' _3 k5 i0 l
$ie.Navigate(“www.bing.com”)  D& I* Z8 i. k- M8 `2 ~
$ie.Quit(): U) f& l9 I! B% Y! q4 `
复制代码. c! ~% U5 H9 j- F1 X
以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。 . ?/ T4 W) Y2 V$ k3 e- F
与实力派WMI结盟
. Y/ W6 i3 z, P  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:
% l4 w; H- v5 ?3 V* IGet-WmiObject -Namespace "root\cimv2" -Class Win32_Process
9 Q5 W9 s" x3 ]+ Z  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。
; r5 q/ c& f9 S' x1 B9 u  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!) o& e/ \. z0 N$ t2 Z8 m/ _% \" T
结语2 E4 @+ L. [: ], i
  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?9 N" k. U, Z% R4 C
! _% G7 F2 H7 F3 ?' z% |& [. U  l

8 s$ L2 @; Q: t1 k7 i1 q& P3 M7 u1 E0 U
上一篇
下一篇


左岸云烟 「出类拔萃」 2018-5-1 15:56 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

曾梦想仗剑走天涯,因太穷放弃了计划#j328:
安心的味道 「锋芒初露」 2018-5-4 21:58 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

看了楼主的帖子,不由得精神为之一振,自觉七经八脉为之一畅,七窍倒也开了六巧半,自古英雄出少年,楼主年纪轻轻,就有经天纬地之才,定国安邦之智,古人云,卧龙凤雏得一而安天下,而今,天佑我大中华,沧海桑田5000年,中华神州平地一声雷,飞沙走石,大舞迷天,朦胧中,只见顶天立地一金甲天神立于天地间,这人英雄手持双斧,二目如电,一斧下去,混沌初开,二斧下去,女娲造人,三斧下去,小生倾倒.得此大英雄,实耐之幸也,民之福也,怎不叫人喜极而泣.......古人有少年楼主说为证,少年之楼主如红日初升,其道大光;河出伏流,一泻汪洋;潜龙腾渊,鳞爪飞扬;乳虎啸谷,百兽震惶;鹰隼试翼,风尘吸张;奇花初胎,皇皇;干将发硎,有作其芒;天戴其苍,地履其黄;纵有千古,横有八荒;小生对楼主之仰慕如滔滔江水连绵不绝,海枯石烂,天崩地裂,永不变心.
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表