批处理之家's Archiver

HAT 发表于 2013-10-29 14:33

玩转PowerShell之(1)检测硬盘自由空间

[table=98%]
  [tr]  [td=1,1,409]玩转PowerShell之(1)检测硬盘自由空间[/td]  [td=1,1,428][url]http://bbs.bathome.net/thread-27008-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(2)计算篇[/td]  [td][url]http://bbs.bathome.net/thread-27010-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(3)命令执行结果[/td]  [td][url]http://bbs.bathome.net/thread-27011-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(4)email篇[/td]  [td][url]http://bbs.bathome.net/thread-27012-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(5)偷偷下载[/td]  [td][url]http://bbs.bathome.net/thread-27013-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(6)数据库篇[/td]  [td][url]http://bbs.bathome.net/thread-27014-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(7)图形菜单[/td]  [td][url]http://bbs.bathome.net/thread-27016-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(8)email篇续  - 把gmail当相册[/td]  [td][url]http://bbs.bathome.net/thread-27017-1-1.html[/url][/td] [/tr]
[tr]  [td]玩转PowerShell之(9)DNS[/td]  [td][url]http://bbs.bathome.net/thread-27018-1-1.html[/url][/td] [/tr]
[/table]
玩powershell已经有几天,发现它实在是太好用了!兄弟们,别在vbs和批处理上费劲了,这边有特别省力的方法啊!
今天开始,逐步推出原创的 玩转PS系列,主要针对管理员的日常管理任务,谈谈在PS上,怎么实现。

第一个任务,检查服务器上面硬盘的自由空间!

首先让我们看看在vbs下面是怎么实现的,下面代码是我从微软脚本中心copy来的。[code]Const HARD_DISK = 3

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")

For Each objDisk in colDisks
    Wscript.Echo "DeviceID: "& vbTab &  objDisk.DeviceID
    Wscript.Echo "Free Disk Space: "& vbTab & objDisk.FreeSpace
Next[/code]注意strComputer = "."这句话,其中的点代表检查本地计算机,如果换成其他服务器的名字,就可以检查远程计算机了。

好了用PS如何做呢?
首先我们把上面那个select语句抄下来,稍加改动,就是PS的格式
$query="Select * from Win32_LogicalDisk Where DriveType = '3'"
看着比vbs简单吧? 注意我把hard_disk换成了数字3,省去了再定义个变量的麻烦。
然后我们就可以直接用PS下面的gwmi (全名为get-wmiobject)命令来进行检测了
$disks = gwmi -query $query
简单吧,上面的命令检测本地计算机的逻辑硬盘,把结果放到$disks变量里面去,如果检测远程计算机呢?把上面的命令改成
$disks = gwmi -query $query -computer "remotepc"
其中remotepc应该是你要检测的远程计算机名字。
下面我们如何查看$disks里面的内容呢?
你可以直接打$disks
会给你一个列表类似这样。
DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 14351843328
Size         : 31453437952
VolumeName   :

DeviceID     : E:
DriveType    : 3
ProviderName :
FreeSpace    : 1361903616
Size         : 5388038144
VolumeName   : New Volume

不太好看哦,我们只需要看看deviceid 和 freespace就可以了。好了运行这一句
$disks | select deviceid, freespace
之后,结果类似下面

deviceid                                                              freespace
--------                                                              ---------
C:                                                                  14351843328
E:                                                                   1361903616
好看多了吧?
我觉得还是不够,我想看到freespace的大小是gb或者mb而不是上面的那个样子。
我们做一个简单的除法就可以了。试试下面的命令
foreach ($disk in $disks)
{
"DiviceID - " + $disk.deviceid
"FreeSize(GB) - "+($disk.freespace/1gb)
}
结果就变成
DiviceID - C:
FreeSize(GB) - 13.3661956787109
DiviceID - E:
FreeSize(GB) - 1.26837158203125

呵呵够精确吧?在PS下面,把 数字转化成mb或gb是非常方便的,不需要你1024,1024的除,只要直接除1gb或1kb或1mb就可以了!

让我们最后总结一下上面的命令[code]$query="Select * from Win32_LogicalDisk Where DriveType = '3'"
$disks = gwmi -query $query
foreach ($disk in $disks)
{
"DiviceID - " + $disk.deviceid
"FreeSize(GB) - "+($disk.freespace/1gb)
}[/code]比较一下vbs的代码,哪个更方便呢?

好事儿做到底,再加点儿功能,想列出多台计算机的信息咋办?
不急,先建立一个变量,假设你有三台服务器,名字是server1,server2,server3[code]$servers= "server1","server2","server3"[/code]然后把上面的代码改写成[code]$query="Select * from Win32_LogicalDisk Where DriveType = '3'"
foreach ($server in $servers)
{
"Servername - " + $server
$disks = gwmi -query $query -computer $server
foreach ($disk in $disks)
{
"DiviceID - " + $disk.deviceid
"FreeSize(GB) - "+($disk.freespace/1gb)
}
}[/code][url=http://bbs.winos.cn/thread-25982-1-1.html]http://bbs.winos.cn/thread-25982-1-1.html[/url]

taofan712 发表于 2017-3-27 17:32

看了大半天的帖子,感觉需要记忆的东西太多啦

523066680 发表于 2017-3-27 17:57

段落用 list 排版缩进一下,会比较好阅读

Nsqs 发表于 2017-3-27 18:04

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=197618&ptid=27008]3#[/url] [i]523066680[/i] [/b]


    下意识看了下发帖时间,论坛这个版块还没逛过~几乎没人

老刘1号 发表于 2017-3-27 18:44

这贴居然没人回,不科学

wrove 发表于 2018-7-22 02:04

[i=s] 本帖最后由 wrove 于 2018-7-22 02:43 编辑 [/i]

现在微软不是转向提倡使用CIM来替代WMI么,功能一样,但cim相关的cmdlets支持要好得多,比如一些参数的自动完成,Tab补全等

上面的应用可以写成:[code]Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType = '3'"[/code]或者:[code]Get-CimInstance -Query "Select * From Win32_LogicalDisk Where DriveType = '3'"[/code]或者【如果你要查询的对象惟一的话,通过Property限定,指向惟一对象】:[code]$x = New-CimInstance -ClassName Win32_LogicalDisk `
    -Property @{ DeviceID = 'C:' } -Key DeviceID -ClientOnly
Get-CimInstance -InputObject $x
[/code]

lihui612ld 发表于 2018-12-8 00:12

get-volume不能用吗

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.