【问题标题】:Powershell script to read 2 columns data from .csv file用于从 .csv 文件中读取 2 列数据的 Powershell 脚本
【发布时间】:2018-07-03 09:52:31
【问题描述】:

我正在尝试编写一个 PowerShell 脚本来获取 csv 文件的 2 列:

ProductName          ProductCode
-----------------------------------------------------------
Java 7 Update 67     {26374892-xxxx-xxxx-xxxx-123456789012}
Java 8  Update 25    {26374892-xxxx-xxxx-xxxx-902341562789}

我只想获取 ProductCode 列值以在 foreach 循环中使用。

我尝试了以下方式

$code1 = Get-Contect %path% | Foreach-Object {
    $_ -split '\s+' | Select-object -skip 1 | Select-Object -Last 1
} 

foreach($code in $code1){ write-host $code } 

我的输出低于输出

67,{232424-55567-8879-xxxxxxx} 
25,{324356456-5674-xxxx-xxxxxx}

但我只想输出像

这样的产品代码
{3245345345-3454-56656757-xxxxx}

【问题讨论】:

  • 我尝试了以下方式 $code1 = Get-Contect %path% | Foreach 对象 { $_ -split '\s+' |选择对象-skip 1 | Select-Object -Last 1 } foreach($code in $code1){ write-host $code } 我低于输出 67,{232424-55567-8879-xxxxxxx} 25,{324356456-5674-xxxx-xxxxxx}但我只想输出产品代码,如 {3245345345-3454-56656757-xxxxx}
  • 请将其添加到您的问题中以提高可读性
  • 上面的代码对我来说是正确的(除了你需要在foreach之前使用| Select-object -skip 1)。您确定您在问题中提供的格式正是您文件中的格式吗?请尝试在Notepad++ 中打开它并使用View > Show symbol > Show all characters(或使用任何其他程序来检查您的文件中有哪些字符)。

标签: powershell


【解决方案1】:

这看起来不像 CSV。我想说最简单的方法是这样的:

Get-Content %path% | Foreach-Object { $_ -split '\s+' | Select-Object -Last 1 }

这样你将在多个空格上拆分字符串后得到最后一个对象

ps。如果您需要跳过标题,您可以在 get-content
之后添加 | Select-Object -Skip 1 pps。如果 import-csv 允许在 delimiter 中使用正则表达式 import csv 会更容易使用,但我怀疑它是否允许这样做。 购买力平价。为我工作:

> cat .\Untitled-2.txt
ProductName ProductCode
Java 7 Update 67     {26374892-xxxx-xxxx-xxxx-123456789012}
Java 8  Update 25    {26374892-xxxx-xxxx-xxxx-902341562789}
> Get-Content .\Untitled-2.txt | select-object -skip 1 | Foreach-Object { $_ -split '\s+' | Select-Object -Last 1 }
{26374892-xxxx-xxxx-xxxx-123456789012}
{26374892-xxxx-xxxx-xxxx-902341562789}

【讨论】:

  • 我尝试了以下方式 $code1 = Get-Contect %path% | Foreach-Object { $_ -split '\s+' |选择对象-skip 1 | Select-Object -Last 1 } foreach($code in $code1){ write-host $code } 我低于输出 67,{232424-55567-8879-xxxxxxx} 25,{324356456-5674-xxxx-xxxxxx}但我只想要像 {3245345345-3454-56656757-xxxxx} 这样的产品代码
  • 嘿,对不起,我不明白。无处查看您的输入,我找不到 67,25, 所以您要么提供了错误的输入示例,要么我不明白
  • 抱歉输入错误。在 ProductName 列中的 .csv 文件中,我提到了 Java 7 Update 67 和 Java 8 Update 25 的名称。您可以在我刚刚编辑的问题中看到相同的名称。
  • 奇怪,我将你的行复制\粘贴到我的 powershell 中并得到正确的结果
  • 我创建了新的 .csv 文件并且它可以工作,但输出也带有标题名称。如果我删除标题 ProductName 和 Product 我得到正确的输出。虽然这些标题不是必需的。如果您有办法不获取标题名称,我会非常有帮助。
【解决方案2】:

您可能想看看您是如何获取这些信息的,因为从源头过滤您想要的信息可能会更容易......

以 java 为例,但该过程可以处理任何事情:

$java = Get-WMIObject Win32_Product | Where-Object { $_.Name -Like "java*" }

$java 将包含有关匹配安装的信息,然后您只需选择所需的属性并将其保存到文件中:

$java | Select-Object -ExpandProperty IdentifyingNumber | Out-File C:\folder\java.txt

这会给你一个类似的文件:

{26374892-xxxx-xxxx-xxxx-123456789012} {26374892-xxxx-xxxx-xxxx-902341562789}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2022-06-10
    • 2022-01-05
    • 1970-01-01
    • 2020-04-23
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多