PowerShell Measure-Object: 完整指南与示例

统计或计算对象的数值属性,如字符串对象中的字符、单词和行数,可能会令人沮丧。幸运的是,PowerShell Measure-Object cmdlet正好能胜任这项任务。

在本教程中,您将学习如何利用Measure-Object cmdlet自动测量PowerShell中对象属性的强大功能。

立即开始,提升您的对象测量技能吧!

先决条件

本教程是一个动手演示。要跟着操作,您需要安装了PowerShell的系统。本教程使用的是安装了PowerShell v7的Windows 10。

统计文件和文件夹

了解目录中文件和文件夹的数量在各种情况下都可能会有所帮助。一个例子是当您需要监视文件夹的大小或检查目录中文件的数量时。

Measure-Object cmdlet用于统计目录中文件和文件夹的数量。准确的计数有助于您更好地管理和优化系统资源。

要了解Measure-Object cmdlet如何统计文件和文件夹的工作方式:

1. 打开 PowerShell,并运行以下命令 Get-ChildItem 来计算并返回当前目录中的文件和文件夹总数 (Measure-Object)。

Get-ChildItem | Measure-Object

下面的输出指示当前目录中有 4852 个文件和文件夹。

Counting the files and folders in the current directory

也许你想要递归地包含目录树中的所有文件和子目录。如果是这样,请添加 -Recurse 参数,如下所示。 Get-ChildItem -Recurse | Measure-Object

2. 接下来,像在步骤一中一样运行相同的命令。但这次,在工作目录中添加 -Directory 参数以仅计算总目录数。

Get-ChildItem -Directory | Measure-Object

如下所示,总数现在较低 (135),因为该命令仅计算了目录,而排除了所有其他对象。

Counting the number of directories in the current directory

3. 现在,运行以下命令来计算当前目录中的可执行文件 (.exe) 数量。

-Filter 参数告诉 Get-ChildItem 命令筛选结果,并仅返回您指定的扩展名的文件(即,*.txt*.jpg*.csv)。

Get-ChildItem -Filter *.exe | Measure-Object
Counting the number of executable files in a directory

测量文件大小

测量对象的长度和大小可以帮助更好地管理您的系统,因为大文件会影响系统性能。除了计算属性之外,您还可以使用Measure-Object cmdlet测量对象的长度和大小。

运行以下代码以检索当前目录中的所有文件(Get-ChildItem)并显示其默认情况下的字节长度(Write-Host)。

以下代码将每个测量输出到控制台,包括最小和最大文件大小,平均文件大小,文件大小总和以及文件总数。

# 设置平均文件大小的阈值
$threshold = 5000000 
# 测量当前目录中每个文件的大小
$files = Get-ChildItem | Measure-Object -Property length -Minimum -Maximum -Sum -Average

Write-Host "Minimum file size: $($files.Minimum) bytes"
Write-Host "Maximum file size: $($files.Maximum) bytes"
Write-Host "Sum of file sizes: $($files.Sum) bytes"
Write-Host "Average file size: $($files.Average) bytes"
Write-Host "Total number of files: $($files.Count)"

# 检查平均文件大小是高于还是低于阈值
if ($files.Average -ge $threshold) {
    # 如果平均文件大小高于阈值,则播放高音
    [console]::beep(1000, 500)
} else {
    # 如果平均文件大小低于阈值,则播放低音
    [console]::beep(500, 500)
}

下面,您可以看到以字节显示的大小。

Measuring file sizes

也许把代码粘贴到控制台不是您的菜。如果是这样,请将代码保存到 PowerShell 脚本文件中并运行它。

现在,运行以下命令以获取当前目录中大小等于最大文件大小($files.Maximum)的文件。

# 获取并存储与 $files.Maximum 大小相同的文件
$max = Get-ChildItem | Where-Object -FilterScript {$_.Length -eq $files.Maximum}
# 显示最大大小 ($files.Maximum) 的值和具有该大小的文件
Write-Host "Maximum file size: $($files.Maximum) bytes `nFile: $max"

下面的输出显示了当前目录中最大文件的名称。

Getting the most extensive file in size

测量文本文件内容

您可能需要确定文本文件中的行数、单词数或字符数,而不是测量文件大小。如果是这样,Measure-Object 命令有许多其他参数可以测量文本文件内容。

运行以下代码以执行对文本文件内容的测量(`Measure-Object`),通过 `-Character`、`-Line` 和 `-Word`,并输出(`Write-Host`)测量结果。

确保将$file_path$file_content变量的值更改为您喜欢的值。

# 定义文件路径和内容
$file_path = "C:\Temp\measure-object.txt"
$file_content = "One fish, two fishes, three fishes"

# 根据定义的文件路径和内容创建文件
Set-Content -Path $file_path -Value $file_content

# 测量文本文件的内容
$measurements = Get-Content -Path $file_path | Measure-Object -Character -Line -Word

# 将测量结果输出到控制台
Write-Host "The file '$file_path' contains $($measurements.Lines) lines, $($measurements.Words) words, and $($measurements.Characters) characters."
Measuring text file contents

测量布尔值

布尔值是只能是真或假的值。在 PowerShell 中,布尔值通常用于控制脚本的流程,确定条件(真或假),或指示命令的成功或失败。

测量布尔值在各种情况下都很有用,例如:

  • 计算数据集中真或假值的数量。
  • 确定真值相对于总值的百分比。

此信息有助于在处理或分析数据时做出明智的决策。

要了解如何测量布尔值的工作原理:

运行以下命令以计算数组($values)中布尔值(默认为true值)的总和。

# 定义一个布尔值数组($true和$false)。
$values = $true,$false,$false,$true,$true,$true,$false,$false,$true
# 测量(计数)布尔值(默认为true值)。
$values | Measure-Object -Sum

下面,布尔值的总数为九(9),而总和为五(5),因为只计算了true值。

那么假值呢?跳到以下步骤,并运行更多命令。

Counting the number of true values in an array

现在,运行下面的代码来从布尔值总数($count)中减去true值的总和($trueCount)。该方程的差异是假值的总数($falseCount)。

# 获取数组中布尔值的总数
$count = $values.Count
# 获取true值的总和
$trueCount = ($values | Measure-Object -Sum).Sum
# 从布尔值的总数中减去true值的总和
# 以获取假值的总数
$falseCount = $count - $trueCount
# 显示true值和假值的总计数
Write-Host "Number of true values: $trueCount"
Write-Host "Number of false values: $falseCount"
Counting the number of false values

如果测量布尔值是日常任务,您可以创建一个可以随时调用的函数来运行任务。

测量哈希表

PowerShell中的哈希表(键值对的集合)可以快速高效地存储和检索数据。如果您需要哈希表中的项目数量或最大最小值,请使用Measure-Object命令来测量您的哈希表。

运行下面的命令来查找哈希表($MyHastable)中Num属性的-Minimum-Maximum值。

# 创建一个包含三个哈希表的哈希表,每个哈希表都有一个Num属性。
$MyHashtable = @(@{Num=10}, @{Num=20}, @{Num=30})
# 测量哈希表的Num属性的最小值和最大值。
$Stats = $MyHashtable | Measure-Object -Minimum -Maximum Num
# 显示哈希表的测量结果
$Stats
Measuring hashtables

测量标准差

审查数据集可能会变得冗长,但不一定非如此。在了解数据集值的分布时,测量标准差是很方便的。您还可以识别任何影响结果的异常值或不寻常的数据点。

标准差衡量数据集值从均值(平均值)的变异或分散程度。该度量通过找到数据方差的平方根来计算,该方差是从均值的平方差的平均值。

运行下面的代码来计算并显示存储在变量$Numbers中的数组的-平均值-标准差

# 定义一个数字数组
$Numbers = 10, 20, 30, 40, 50

# 计算数字的平均值和标准差
$Average = ($Numbers | Measure-Object -Average).Average
$StdDev = ($Numbers | Measure-Object -StandardDeviation).StandardDeviation

# 输出结果
"Average: $Average"
"Standard deviation: $StdDev"

在统计学中,均值衡量中心趋势,描述数据集的典型或最具代表性的值。

平均值是通过将数据集中的所有数字相加并除以值的总数来计算的。在此示例中,数据集为{1020304050},总和为150,集合中有五个数字(5)。

因此,下面计算的平均值为30

Average = (10 + 20 + 30 + 40 + 50) / 5 = 30

另一方面,标准差衡量一组数据的扩散或分散。标准差的计算如下:

1. Find the difference between each data point and the average:
   10 - 30 = -20
   20 - 30 = -10
   30 - 30 = 0
   40 - 30 = 10
   50 - 30 = 20
   
2. Square each of these differences:
   (-20)^2 = 400
   (-10)^2 = 100
   0^2 = 0
   10^2 = 100
   20^2 = 400
   
3. Add up all the squared differences:
   400 + 100 + 0 + 100 + 400 = 1000
   
4. Divide the sum of squared differences by the total number of values:
   1000 / 5 = 200
   
5. Take the square root of the result:
   sqrt(200) = 14.142135623731
   
The standard deviation of this set of data is approximately 14.14. But 
in this case, the result is 15.8113883008419 
because of floating-point arithmetic limitations in computers.
Measuring the standard deviation

结论

测量数据是一项重要任务,而 PowerShell Measure-Object 命令是完成该任务的强大工具。在本教程中,您已经学会了如何以多种方式测量数据。无论您是处理文件、文本文件内容、布尔值、字符串、数组还是哈希表,对它们进行测量都可以提供有价值的见解。

现在,您可以轻松计算数据的平均值、最大值和最小值,并测量数据的变化或扩展。有了这些功能,您可以更深入地了解您的数据,并根据分析做出明智的决策。

有了这些新的知识,为什么不扩展您的 PowerShell 工具包并将 Compare-Object 添加到您的工具库中呢?

Source:
https://adamtheautomator.com/powershell-measure-object/