[玩转系统] 物体的价值
作者:精品下载站 日期:2024-12-14 08:07:24 浏览:11 分类:玩电脑
物体的价值
我预计我会写几篇有关 PowerShell 及其与对象的关系的文章。我知道这是PowerShell初学者要克服的最大障碍。但是,一旦他们了解到 PowerShell 是用于处理管道中的对象,他们就会认识到其中的价值,并开始发现编写 PowerShell 代码并在控制台提示符下以交互方式使用它更容易。
很久很久以前在控制台中
不要忘记,我是从 IT 专业人员的角度来接触 PowerShell 的。其中许多人使用 PowerShell 时都具备其他自动化和脚本编写技能。它可能是老式的批处理文件。这可能是丰富的 VBScript 经验。这就是我的 PowerShell 之旅。和你们中的许多人一样,我最初的 PowerShell 经历也受到了我过去的影响。我一直尝试让 PowerShell 编写文本,就像使用 VBScript 一样。这是一个旧的例子。
Dim objSet, wshell
On Error Resume Next
Set wshell=CreateObject("Wscript.Shell")
If wscript.arguments.count=0 Then
strSrv=InputBox("What server do you want to check? You must have admin rights on it. Do NOT use \ " & _
"before the servername.","Disk Check","SERVERNAME")
If strSrv="" Then
wshell.popup "Nothing entered or you cancelled",4,"Disk Check",0+48
wscript.quit
End If
Else
strSrv=Trim(wscript.arguments(0))
End If
strQuery = "Select * from win32_logicaldisk where drivetype=3"
Set objSet=GetObject("winmgmts:\" & strSrv).ExecQuery(strQuery)
if err.number<>0 then
wshell.popup "Oops! Error connecting to " & UCase(strSrv) & vbCrlf & "make sure you are using valid " & _
"credentials." & vbCrlf & "Error: " & err.number & " - " & err.description,5,"Disk Check Error",0+48
wscript.quit
end if
For Each item In objSet
PerFree=FormatPercent(item.FreeSpace/item.Size,2)
o=o & item.DeviceID & "\" & VBTAB
o=o & FormatNumber(item.Size/1048576,0) & Vbtab & FormatNumber(item.FreeSpace/1048576,0) & Vbtab & PerFree & Vbcrlf
next
WScript.Echo "Drive" & Vbtab & "Size (MB) Free (MB) %Free" & VbCrLf & o
set objSet=Nothing
set wshell=Nothing
wscript.quit
不要恐慌。我不会尝试教您 VBScript。该脚本从 WMI 获取磁盘信息并显示摘要。但为了获得所需的结果,我花了很多时间创建要显示的文本字符串。在 For Each item
部分中,我正在为每个驱动器构建一个字符串,显示大小和可用空间。每个驱动器都连接到变量 o
。在脚本的最后,我将信息字符串写入屏幕。
WScript.Echo "Drive" & Vbtab & "Size (MB) Free (MB) %Free" & VbCrLf & o
这就是我最终得到的结果。
许多刚接触 PowerShell 的人都试图强制它这样做。他们习惯于返回文本字符串的脚本语言。对于具有 Linux bash 脚本背景的人来说尤其如此。因为Linux是一个基于文本的操作系统,所以它的工具是基于解析文本的概念的。刚接触 PowerShell 且仍停留在文本范例中的人可能会编写如下所示的 PowerShell 脚本。
$strSrv = Read-Host "Enter a computername"
$strQuery = "Select * from win32_logicaldisk where drivetype=3"
$objSet = Get-WmiObject -Query $strQuery -ComputerName $strSrv
Write-Host "Drive`t Size (MB) Free (MB) %Free"
foreach ($item in $objSet) {
$perFree = ($item.FreeSpace/$item.size)*100
$line = $item.DeviceID + "\ `t" + $item.Size/1048576 + " " + $item.FreeSpace/1048576 + " " + $perFree
Write-Host $line
}
可悲的是,我在现实世界中见过这样的代码。它会起作用的。有点。
但这是一项繁重的工作。人们沉迷于文本的原因之一是,在 PowerShell 中运行命令几乎总是会产生易于阅读的文本输出。想想您从 Get-Service
和 Get-Process 获得的结果。
对象很简单
对象的想法不应该那么困难。我们每天都会与现实世界中的物体打交道。挑战在于让我们的头脑了解虚拟对象的概念。如果您花时间查看 PowerShell,您会发现它正在努力帮助您。命令名称暗示对象。 Get-Service
将获取服务对象。在这种情况下,使用完整的 cmdlet 名称而不是 gsv 别名可以帮助初学者。您不想在学习 PowerShell 时想:“当我运行 gsv 命令时,我会得到一个服务列表。”您可能会想,“当我运行 Get-Service 命令时,我正在获取可以传递给另一个命令的服务对象的集合。”
让我们回顾一下 WMI 代码。该代码表示:“给我一个 WMI 对象,它是一个 Win32_Logicialdisk,满足指定远程计算机上的特定条件。”返回这些对象后,代码会告诉 PowerShell 要显示哪些对象属性。显示结果,PowerShell 自动处理所有格式设置。
$computername = Read-Host "Enter a computername"
$Query = "Select * from win32_logicaldisk where drivetype=3"
Get-WmiObject -Query $Query -ComputerName $computername |
Select-Object -property DeviceID,Size,Freespace,
@{Name="PercentFree";Expression = {$_.freespace/$_.size}}
PowerShell 的最佳功能之一是您还可以定义新的对象属性。 WMI win32_logicdisk 对象没有 PercentFree 属性。但是 Select-Object
可以使用自定义哈希表为我做到这一点。
一旦你开始思考对象而不是解析文本,你就会意识到整个世界充满了可能性。我告诉刚开始使用 PowerShell 的脚本编写者大声说出他们希望 PowerShell 做什么。
从远程计算机获取所有固定逻辑磁盘。选择计算机名称、驱动器号、大小(以 GB 为单位)、可用磁盘空间和可用空间百分比,然后导出到 CSV 文件。
一旦明确表达了您的需求,您就可以找到 PowerShell 命令和参数来实现它。
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $computername |Select-Object -property DeviceID,@{Name="SizeGB";Expression = {$_.size/1GB -as [int32]}},Freespace,@{Name="PercentFree";Expression = {($_.freespace/$_.size)*100}},SystemName |Export-CSV c:\work\diskinfo.csv -Append
初学者面临的最大障碍是使用 Get-Member
发现对象属性以及格式化值的技巧,例如使用 1GB 快捷方式和 -As
运算符。我发现能够可视化管道中对象概念的人会更快、更轻松地采用 PowerShell。
这并不是说我们仍然不需要搞乱文本或值。我上面定义的免费价值百分比就是一个很好的例子。您可能倾向于使用 -f
运算符。
@{Name="PercentFree";Expression = {"{0:p2}" -f ($_.freespace/$_.size)}}
它看起来确实不错。
如果我只想看看这个结果,我可能没问题。但即使在这里,我们还是回到了文本。如果我将此输出通过管道传递给 Get-Member
,我将看到 PercentFree 属性是 System.String
。当我想对值执行某些操作(例如排序)时,就会出现问题。该值将作为字符串而不是数字排序,我可能无法得到预期的结果。
我发现更好的方法是使用 [math] 类将该值视为 [System.Double]
对象,将值四舍五入到小数点后两位。
@{Name="PercentFree";Expression = {[math]::round(($_.freespace/$_.size)*100,2)}}
这样,我就得到了我想要的格式化百分比和我可以使用的值。
我希望你能看到这里的价值。
函数写入对象
故事的最后一部分我想简要讨论一下 PowerShell 函数。对于如何正确编写 PowerShell 函数及其行为方式,我有非常强烈的意见。对于具有开发人员背景或可能习惯于编写 VBScript 子例程的 PowerShell 的人来说,这通常是不一致的。
虽然我认识到存在例外,但 PowerShell 函数应该将一系列对象(或者可能是单个对象)写入管道。它不会返回任何看起来像字符串的东西。从技术上讲,这个简单的 PowerShell 函数没有任何问题。
Function Get-PercentFree {
Param($Drive = "C:", $Computername = $env:COMPUTERNAME)
$d = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='$Drive'" -ComputerName $computername
$p = [math]::round(($d.freespace / $d.size) * 100, 2)
return $p
}
但其价值有限。我将得到的只是 40.96 这样的结果。我会将这种类型的代码编写为 VBScript 子例程。但我们谈论的是 PowerShell。我想要管道中的一个对象。
Function Get-LogicalDisk {
[cmdletbinding()]
Param($Computername = $env:COMPUTERNAME)
$disks = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $computername
$disks | Select-Object @{Name = "Computername"; Expression = { $_.SystemName } },
DeviceID, Size, FreeSpace, @{Name = "PercentFree"; Expression = { [math]::round(($_.freespace / $_.size) * 100, 2) } },
@{Name = "Audit"; Expression = { Get-Date } }
}
编写该函数是为了表达一个观点,而不一定是为生产做好准备的东西。运行该函数会给出这种输出。
如果我需要的只是百分之百的免费,那么检索起来就很容易了。
该函数灵活且可重用,因为它将丰富的对象写入管道。
如果您在函数中注意到,我也没有格式化大小和可用空间值。我以字节为单位留下了它们。在 PowerShell 中获取或创建对象与其格式化或呈现方式是分开的。但这是另一天的话题。
如果我需要字符串(例如日志文件),我仍然可以从对象创建它们。
$data = "prospero","thinkx1-jh","dom1","srv2" |
Foreach-Object { Get-LogicalDisk -Computername $_ }
foreach ($item in $data) {
$line = "[{0:d}] Drive {1} on {2} is {3}% free" -f $item.Audit,$item.DeviceID,$item.computername,$item.percentfree
$line
#$line | Out-File log.txt -append
}
请注意,由于 Audit 属性是日期时间对象,因此我可以使用 d
限定符对其进行格式化。
尝试使用基于文本的范例来完成此任务要复杂得多且令人沮丧。
您越多地考虑可以从 PowerShell 获得的对象以及如何使用它,您就能完成更多的任务,而且很可能会使用更好的 PowerShell 代码。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag