那种亲密的人突然陌生,希望完全落空的感觉,就好像喝口凉水居然被烫到。 收藏本站
登陆 / 注册 搜索

阅读: 4K   回复: 3

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

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

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

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑
- f2 o  [5 r7 Z- p. ?& b& K0 u  x% p: J
  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。! o% C( p! s3 |1 q0 V4 F

" @* ?- q( U9 u3 @与新锐.Net联姻' b6 o2 F- p7 y% h, `8 j) T8 a
  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:. i2 `8 x( b+ |( H% L, z0 D% z+ g
+ ^, [. E$ w' i9 I
复制代码: V8 i9 J: f, b0 N) M
Add-Type -AssemblyName mscorlib" K6 ]$ a. A3 @0 m9 f
$str = New-Object System.Text.StringBuilder
3 D* ~7 n' u+ D! M$str.Append("Hello")
/ j$ Y& x- E, d  k3 i  K$str.ToString()
& W: ^: `% e" X. i/ |复制代码
- S, e3 G) a. H# Z其结果是输出Hello字符串。3 B, ]) |2 ]5 C% l% v7 C9 g
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:% ~: A, a: u  C0 o
首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。) ?5 ]: [8 K# }. a& [) Y( S7 z
复制代码2 F# h4 E; B' G- b4 K8 c# U& a% F3 U
using System;  Q4 R: `8 F  c8 U. K& H/ T
namespace PowerShellDemo
& i7 K# j* M& l! x{; ?$ x# I! |) [1 X. X9 |
    public class PowerShellDemo
; `* M' M0 u2 k/ e! o  e4 f    {5 q! X) }  p& M$ Q; j
        public void Greet()5 l4 m% [  _* R( c1 v4 F. Q, ?
        {
6 t  Z3 ^8 i$ h& _1 H8 L3 \            Console.WriteLine("Hello!");
; w4 ^2 t8 C/ R- i$ M1 l4 _        }
/ B2 x" @" v$ Y: n8 B8 }( q3 w! c    }/ B0 \9 e/ {3 X, V" B2 c" P: v
}2 V0 P- d% `1 w" K: L1 A
复制代码
) x/ Y, k( X0 \8 ?1 H% q) ]然后将其导入到PowerShell会话中,并使用其函数或者属性。2 l# o4 w( H( ~) B. y1 {) q& i& L
Add-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”& q' G' l5 p8 W
$obj = New-Object PowerShellDemo.PowerShellDemo
# N7 n" N, [- e0 o$obj.Greet()  b# J+ S$ B' A( n# k0 g9 _( g
以上调用的输出是Hello字符串.7 a; |6 ~/ _( h& q% q  @$ b( C9 L
  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。/ G( k# p' {0 s/ d0 J+ F# M" A- n  N
与贵族COM为伍. j: E! ]; ], k# b1 W
COM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:- U) a6 b& t% @* N
复制代码# y& r9 z, O. {
$ie = New-Object -ComObject InternetExplorer.Application9 P" U- e8 f: b; W# E- s
$ie.Visible = $true" l. E, A1 f9 G3 {$ U2 x
$ie.Navigate(“www.bing.com”)' G. M2 t9 w) y( j' y+ B
$ie.Quit()
0 V$ j8 g; E" V复制代码
1 J1 q9 b# n  l以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。
, i: L* k, P8 F' K与实力派WMI结盟
7 e7 U  m# y1 O  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:
3 S7 J0 l; ^; _/ m; @' h$ BGet-WmiObject -Namespace "root\cimv2" -Class Win32_Process1 J( s" F7 y$ l* x# A+ n
  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。
5 P2 Z6 [7 _' g4 a  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!
9 U6 a% l) y0 Q9 `2 U6 T3 [结语
1 z( L2 s! _; E7 s6 L  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?6 @( _; W# p  L2 O
! Z: P# T8 ]4 k. U: g
8 T' e+ R) q9 Q8 |
) {$ J' L7 f; A" f3 |
上一篇
下一篇


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

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

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

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

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

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2021-4-12 04:47 , Processed in 0.033351 second(s), 20 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表