【问题标题】:If Else statement Powershell CSVIf Else 语句 Powershell CSV
【发布时间】:2017-06-14 14:13:42
【问题描述】:

当我运行我的代码时,它给了我以下错误。 我让代码做的是获取 csv 然后将名称列过滤为仅是管理员,然后我让标题列过滤我提供的所有操作系统。 if 语句是说如果列 Type0 等于域,则将 Domain0 放在 Account0 后面的“唯一帐户名称”列中。否则,它将把它放在 Netbios 名称中,然后是 Account0。下面是excel表格。以及每个所需的输出。

 Import-Csv 'U:\Local Group Members.csv' | where-Object {($_.Name0 -eq "administrators") -and ($_.caption0 -match "Microsoft Windows 10 Enterprise|Microsoft Windows 7 Enterprise|Microsoft Windows 7 Professional|Microsoft Windows 8 Enterprise|Microsoft Windows 8 Pro|Microsoft Windows 8.1 Enterprise|Microsoft Windows 8.1 Pro")} |
Select-Object "Netbios_name0", "Name0", "Account0","category0","Domain0","Unique Account Name","Type0","caption0", "Excluded" |
ForEach-Object 

If ($_.Type0 -eq 'Domain') { 
    $_.UniqueAccountName = "$($_.Domain0) - $($_.Account0)" 
} Else { 
    $_.UniqueAccountName = "$($_.Netbios_name0) - $($_.Account0)" 
}

Export-Csv -notypeinformation U:\LGMbestone.csv

我是powershell新手,卡住了,如何让这段代码运行?

【问题讨论】:

  • 在没有足够细节的情况下多次重复问同一个问题似乎不太可能给你答案。
  • @Bill_Stewart 这个不比另一个提供更多细节吗?
  • @Bill_Stewart 这是一个不同的问题。这个是关于唯一帐户名称的。
  • 非常非常接近同一件事。

标签: powershell csv if-statement


【解决方案1】:

您不能通过管道传递到 if 语句,并且您需要逐行遍历结果以修改对象,这需要一个 foreach 循环。此外,通过管道传输到 Export-CSV 比使用输入对象调用它要好。下面是基于您的代码的示例。希望这会有所帮助!

    $csv = Import-Csv 'U:\Local Group Members.csv' |
Where-Object {($_.Name0 -eq "administrators") -and ($_.caption0 -match "Microsoft Windows 10 Enterprise|Microsoft Windows 7 Enterprise|Microsoft Windows 7 Professional|Microsoft Windows 8 Enterprise|Microsoft Windows 8 Pro|Microsoft Windows 8.1 Enterprise|Microsoft Windows 8.1 Pro")} |
Select-Object "Netbios_name0", "Name0", "Account0","category0","Domain0","Unique Account Name","Type0","caption0", "Excluded"

#Modify each line based on your parameters
Foreach ($row in $csv) {
    If ($row.Type0 -eq 'Domain') { 
        $row."Unique Account Name" = "$($row.Domain0) - $($row.Account0)" 
        Write-Host $row."Unique Account Name"
    } Else { 
        $row."Unique Account Name" = "$($row.Netbios_name0) - $($row.Account0)"
    }
}

#Export CSV
$csv | Export-Csv C:\LGMbestone.csv -NoTypeInformation

【讨论】:

  • 我运行了该代码,它为我运行了所有代码,只是它没有给我导出 csv
  • 这似乎在我切换路径后工作。但现在该代码仅适用于“域”部分。
  • @Sprengdilly 尝试将$row."Unique Account Name" 更改为$row.UniqueAccountName。它必须与 CSV 中的列名匹配,因此如果 CSV 中没有空格,请删除脚本中的空格。让我知道这是否有帮助。
  • 不幸的是,这并没有帮助,域部分正如我之前所说的那样工作,所以我认为它与“唯一帐户名”没有任何关系
  • 我仔细检查了所有内容的所有拼写,但它似乎仍然不适用于本地拼写。做另一个 if 语句可以解决这个问题吗?
【解决方案2】:

看起来像是一个格式问题。对于 foreach ,它应该是这样的:

$import=Import-Csv 'U:\Local Group Members.csv' | where-Object {($_.Name0 -eq "administrators") -and ($_.caption0 -match "Microsoft Windows 10 Enterprise|Microsoft Windows 7 Enterprise|Microsoft Windows 7 Professional|Microsoft Windows 8 Enterprise|Microsoft Windows 8 Pro|Microsoft Windows 8.1 Enterprise|Microsoft Windows 8.1 Pro")} |
Select-Object "Netbios_name0", "Name0", "Account0","category0","Domain0","Unique Account Name","Type0","caption0", "Excluded" 

ForEach($imp in $import)
{ 

    If ($imp.Type0 -eq 'Domain') 
    { 
        $imp.UniqueAccountName = "$($imp.Domain0) - $($imp.Account0)" 
    } 
    Else 
    { 
        $imp.UniqueAccountName = "$($imp.Netbios_name0) - $($imp.Account0)" 
    }

    Export-Csv "$imp.UniqueAccountName" -notypeinformation "U:\LGMbestone.csv" -Append
}

注意:我没有检查 import-csv 部分。我相信它正确地获取数据,你应该使用 foreach 循环来迭代每一行值

【讨论】:

  • 你不能通过管道发送到if
  • 错字:).删除它
  • @RanadipDutta 你能通过使用 foreach 循环并迭代每一行值来说明你的意思吗?
  • @RanadipDutta 这可能是一个愚蠢的问题,但代码末尾的 -append 是什么?
  • -Append 用于追加文件中的数据。示例:您已经在文件中有 data1。并且您想将 data2 添加到保留 data1 的文件中。那是附加的。因此,在这种情况下,从循环中出来的每个数据都会在整个循环中附加(每次添加附加值而不是替换文件)。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2017-02-05
  • 2015-07-06
  • 2012-08-05
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多