当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 从输出中删除标头 [5 种方法]

作者:精品下载站 日期:2024-12-14 05:31:14 浏览:14 分类:玩电脑

PowerShell 从输出中删除标头 [5 种方法]


[玩转系统] PowerShell 从输出中删除标头 [5 种方法]

对于本文,我们将使用 CSV 文件,您可以使用自己的文件,但我们将使用包含以下数据的 inputFile.csv

inputFile.csv 文件的内容:

FirstName,LastName,Department
Shruti,Mehta,Computer Science
Mehvish,Ashiq,Mathematics
John,Christopher,Psychology
Saira,Daniel,Humanities
Gurmeet,Kaur,Arts

从导入的数据中删除标头

在 PowerShell 中进一步处理之前,我们可以使用各种方法从导入的数据中删除标头。下面我们就来学习一下它们。

使用 -HideTableHeaders 参数

使用 -HideTableHeaders 参数从 PowerShell 中导入的数据中删除标头。

使用 -HideTableHeaders 参数:

$inputData = Import-Csv -Path "E:/Test/inputFile.csv"
$dataWithoutHeader = $inputData | Format-Table -HideTableHeaders
echo "Data with Header:", $inputData
echo "`nData without Header:", $dataWithoutHeader

输出 :

Data with Header:

FirstName LastName    Department
--------- --------    ----------
Shruti    Mehta       Computer Science
Mehvish   Ashiq       Mathematics
John      Christopher Psychology
Saira     Daniel      Humanities
Gurmeet   Kaur        Arts

Data without Header:

Shruti    Mehta       Computer Science
Mehvish   Ashiq       Mathematics
John      Christopher Psychology
Saira     Daniel      Humanities
Gurmeet   Kaur        Arts

我们使用 Import-Csv cmdlet 导入使用 -Path 参数指定的给定 CSV 文件 (inputFile.csv) 的内容。 Import-Csv cmdlet 创建了类似表格的自定义对象,行中的项目成为属性值。

此 cmdlet 适用于任何 CSV 文件,包括使用 Export-Csv cmdlet 生成的文件。请记住,我们可以省略 -Path 参数并指定文件路径而不使用此参数名称。

我们将读取的数据存储在 $inputData 变量中,该变量通过管道传输到 Format-Table cmdlet 以将输出格式化为表格。我们使用此 cmdlet 和 -HideTableHeader 参数来隐藏输出表中的标头,并将其存储在 $dataWithoutHeader 变量中。最后,我们使用 echo 命令来显示带/不带标题的数据。

请注意,Format-Table cmdlet 的 -HideTableHeaders 参数不会删除/移除标头,而仅隐藏标头在输出控制台中的显示。这就是为什么在 Data without Header: 字符串和没有 header 的输出表之间有足够的空间;请参阅上面的输出。

如果您不想用空格代替标题,可以使用 Out-String cmd 和 trim() 方法。

使用 -HideTableHeaders 参数:

$inputData = Import-Csv -Path "E:/Test/inputFile.csv"
$dataWithoutHeader = ($inputData | Format-Table -HideTableHeaders| Out-String).trim() 
echo "Data without Header:", $dataWithoutHeader

值得注意的是,Format-Table cmdlet 主要用于格式化输出控制台中的数据;如果要将输出数据导出到 CSV 文件,不建议使用它。同样,您使用的是 Export-Csv 还是 Set-Content cmdlet 并不重要。为什么?

原因是,如果您使用 Format-Table 并将输出数据导出到 CSV 文件,您可能会得到扭曲或意外的数据,因为 Format-Table cmdlet 会生成格式化文本而不是结构化数据,最适合 CSV 格式。

如何将数据导出到 CSV 文件?要导出输出数据,您必须避免使用 Format-Table cmdlet,并处理结构化数据以获得用于 CSV 导出的预期输出数据。如何?我们将在接下来的部分中学习。

通常,Format-Table cmdlet 应该是管道中的最后一个,并且仅在您不想将结果导出为 CSV 文件时才建议使用它。

使用带有 -ExpandProperty 参数的 Select-Object Cmdlet

使用带有 -ExpandProperty 参数的 Select-Object cmdlet 从 PowerShell 中导入的数据中获取一个属性的值(不包含其标头)。

使用带有 -ExpandProperty 参数的 Select Cmdlet:

Import-Csv "E:/Test/inputFile.csv" | Select-Object -ExpandProperty FirstName

输出 :

Shruti
Mehvish
John
Saira
Gurmeet

我们之前已经了解了 Import-CsvSelect-Object。在这里,我们使用 -ExpandProperty 参数来指定要捕获其值的属性名称。

到目前为止,我们使用 Select-Object cmdlet 来获取一个或所有不带标头的属性的值。 如果我们严格指示获取 n 属性的值并将它们显示在 PowerShell 控制台上怎么办?请参阅以下脚本以了解如何操作。

使用带有 -Skip 参数的 Select-Object Cmdlet

使用带有 -Skip 参数的 Select cmdlet 从 PowerShell 中导入的数据中删除标头并获取所有属性的值。

使用带有 -Skip 参数的 Select-Object Cmdlet:

$inputData = Import-Csv -Path "E:/Test/inputFile.csv"
$inputData | 
ConvertTo-Csv -NoTypeInformation |
ForEach{ $_ -replace '"' ,''} |
Select-Object -Skip 1 | 
Set-Content "E:/Test/outputFile.csv"
echo "Data with Header:", $inputData
$outputData = Get-Content "E:/Test/outputFile.csv"
echo "`nData without Header:", $outputData

输出 :

Data with Header:

FirstName LastName    Department
--------- --------    ----------
Shruti    Mehta       Computer Science
Mehvish   Ashiq       Mathematics
John      Christopher Psychology
Saira     Daniel      Humanities
Gurmeet   Kaur        Arts

Data without Header:
Shruti,Mehta,Computer Science
Mehvish,Ashiq,Mathematics
John,Christopher,Psychology
Saira,Daniel,Humanities
Gurmeet,Kaur,Arts

我们再次使用 Import-Csv cmdlet 从我们使用 -Path 参数指定的 CSV 文件导入数据;我们将导入的数据存储在 $inputData 变量中,该变量被转发到多管道语句。

在此多管道语句中,我们使用 ConvertTo-Csv cmdlet 将 .NET 对象转换为一系列 CSV 字符串。由于我们不需要类型信息,因此我们使用 -NoTypeInformation 参数从输出中删除 #TYPE 信息标头。此输出进一步通过管道传送到 ForEach 语句。

ConvertTo-Csv cmdlet 用于由于某些待处理操作而无需导出到文件的情况。自 PowerShell 6.0 以来,-NoTypeInformation 是默认参数。

ForEach 语句迭代由 ConvertTo-Csv cmdlet 生成的对象数组,并将双引号 (") 替换为空字符串 ( '') 使用 -replace 运算符,这里,$_ 表示当前项。

然后,我们使用带有 -Skip 参数的 Select-Object cmdlet,该参数的值设置为 1(这是该参数的起始值) )。它选择跳过标头的所有数据,并将其通过管道传送到 Set-Content cmdlet,该 cmdlet 写入 outputFile.csv 文件。

我们使用 Get-Content cmdlet 检索 outputFile.csv 文件的内容,并使用 echo 命令打印带有/不带有PowerShell 控制台上的标头。

如果您不想使用 ConvertTo-Csv cmdlet,则必须使用 Get-Content cmdlet 读取 inputFile.csv 的内容 文件。否则,您的 outputFile.csv 将包含 @{FirstName=Mehvish; 中的内容;姓氏=Ashiq; Department=Mathematics} 格式。

使用带有 -Skip 参数的 Select-Object Cmdlet:

$inputData = Get-Content "E:/Test/inputFile.csv"
$inputData | 
Select-Object -Skip 1 | 
Set-Content "E:/Test/outputFile.csv"
echo "Data with Header:", $inputData
$outputData = Get-Content "E:/Test/outputFile.csv"
echo "`nData without Header:", $outputData

输出 :

Data with Header:
FirstName,LastName,Department
Shruti,Mehta,Computer Science
Mehvish,Ashiq,Mathematics
John,Christopher,Psychology
Saira,Daniel,Humanities
Gurmeet,Kaur,Arts

Data without Header:
Shruti,Mehta,Computer Science
Mehvish,Ashiq,Mathematics
John,Christopher,Psychology
Saira,Daniel,Humanities
Gurmeet,Kaur,Arts

如果您想替换主文件(inputFile.csv)中的内容,那么您可以使用以下紧凑命令:

使用带有 -Skip 参数的 Select-Object Cmdlet:

(Get-Content E:/Test/inputFile.csv)|
Select-Object -Skip 1|
Set-Content "E:/Test/inputFile.csv"

输出:inputFile.csv 的内容:

Shruti,Mehta,Computer Science
Mehvish,Ashiq,Mathematics
John,Christopher,Psychology
Saira,Daniel,Humanities
Gurmeet,Kaur,Arts

对于这种特定方法,不要忘记使用 () 括起 Get-Content cmdlet,以便它可以读取整个 inputFile.csv首先进入内存,如果您应该将其作为同一命令的一部分保存回确切的文件,则这是强制性的。

Select-ObjectForEach-Object Cmdlet 结合使用

使用 Select-Object cmdlet 和 ForEach-Object cmdlet 从导入的数据中删除 n 属性的标头。

将 Select-Object 与 ForEach-Object Cmdlet 结合使用:

Import-Csv "E:/Test/inputFile.csv" | 
Select-Object FirstName, LastName |
ForEach-Object {$_.FirstName + "," + $_.LastName}

输出 :

Shruti,Mehta
Mehvish,Ashiq
John,Christopher
Saira,Daniel
Gurmeet,Kaur

我们已经了解了 Import-CsvSelect-ObjectForEach-Object cmdlet。此方法最好选择 n 个属性,其中 n 大于 1 且小于给定 CSV 中的记录总数文件。

或者,我们可以使用 -f 运算符,如下所示:

使用 -f 运算符:

Import-Csv "E:/Test/inputFile.csv" | 
%{ "{0},{1}" -f $_.FirstName,$_.LastName }

输出 :

Shruti,Mehta
Mehvish,Ashiq
John,Christopher
Saira,Daniel
Gurmeet,Kaur

我们使用 Import-Csv cmdlet 从指定的 CSV 文件导入内容,该内容进一步通过管道传输到 ForEach-Object 命令来处理每个对象。 %ForEach-Object cmdlet 的别名。

ForEach-Object 脚本块中,我们使用 -f 字符串格式运算符来格式化输出。此处,"{0},{1}" 格式字符串定义了格式设置模式,指定了两个占位符 {0}{1}对于名字和姓氏。

$_ 表示当前正在管道中处理的对象;此处,使用点符号作为 $_.FirstName$_.LastName 访问 FirstNameLastName 属性。

到目前为止,我们已经学习了如何从 CSV 文件导入数据并在进一步处理之前删除标头。如果您想从 PowerShell 命令的输出中删除标头该怎么办?

从 PS 命令的输出中删除标头

我们有多种方法可以从 PowerShell 命令生成的输出中删除标头。我们可以根据我们的项目需要使用其中任何一个。下面让我们来了解其中的一些。

使用 -HideTableHeaders 参数从 PowerShell 中导入的数据中删除标头。

使用 -HideTableHeaders 参数:

Get-Alias | Format-Table -HideTableHeaders

输出 :

Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           CFS -> ConvertFrom-String   3.1.0.0    Microsoft.PowerShell.Utility
...              ...                        ...     ...
...              ...                        ...     ...
...              ...                        ...     ...

使用带有 -ExpandProperty 参数的 Select cmdlet 可在 PowerShell 中获取一个属性的值,而无需其标头。

使用带有 -ExpandProperty 参数的 Select Cmdlet:

Get-Alias | Select -ExpandProperty Name

输出 :

%
?
ac
asnp
cat
cd
CFS
chdir
...
...
...

请记住,SelectSelect-Object 的别名,这意味着您可以交替使用它们。

在 PowerShell 中使用 ForEach 循环获取一个属性的值,而无需其标头。

使用 ForEach 循环:

Get-Alias | ForEach {$_.Name}

输出 :

%
?
ac
asnp
cat
cd
CFS
chdir
...
...
...

使用 -f 运算符在 PowerShell 中获取多个属性的值,而无需其标头。

使用 -f 运算符:

Get-Alias | %{ "{0},{1}" -f $_.CommandType,$_.Definition }

输出 :

Alias,ForEach-Object
Alias,Where-Object
Alias,Add-Content
Alias,Add-PSSnapIn
Alias,Get-Content
Alias,Set-Location
Alias,ConvertFrom-String
Alias,Set-Location
Alias,Clear-Content
... , ...
... , ...
... , ...

我们在从导入的数据中删除标头的同时学习了这些 cmdlet 和运算符。

这就是 Powershell 从输出中删除标头的全部内容。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯