powershell - 根据列中每个条目的条件输出.csv中的行

时间:2016-07-21 18:56:56

标签: powershell

我是PowerShell的新手,并且编码经验非常少。

对于初读的道歉,我试图将我试图做的事情放到上下文中,但为了使其更容易,我减少了文本的墙。并添加了源文件。

我真诚地道歉......

我的任务是创建一个脚本来验证来自其他服务器的输出.csv的用户帐户。
导入.csv将包含其他列,但我在过滤用户名列时遇到问题 首先,我输出我需要的列'机器名称'和$ '用户名'到" $ ADUserList",删除""在每个条目周围,有:

$SourceFile1 | select $_'Machine Name', $_'User Name' | ConvertTo-Csv -Delimiter ',' -NoTypeInformation | foreach { $_ -replace '^"','' -replace "`"$delimiter`"",$delimiter -replace '"$','' }|'

这是我遇到问题的地方:

然后我导入" $ ADUserList"尝试输出与预期用户格式(8位长,所有数字)匹配的每一行到" GoodADUser.csv"和那些不匹配" BadADUser.csv"  失败点:

    $ADUserList = Import-Csv $PSScriptRoot\Output\ADUserList.csv 
ForEach-Object {$item -in $ADUserList
  IF ($SourceFile1.'User Name'.Length -eq 8 -and $SourceFile1.'User Name' -is [int])
  {$item | ConvertTo-Csv -Delimiter $delimiter -NoTypeInformation | foreach { $i -replace '^"','' -replace "`"$delimiter`"",$delimiter -replace '"$','' }| Out-File $PSScriptRoot\Output\GoodADUserList.csv -Force
  }
   Else 
  {$item | ConvertTo-Csv -Delimiter $delimiter -NoTypeInformation | foreach { $i -replace '^"','' -replace "`"$delimiter`"",$delimiter -replace '"$','' }| Out-File $PSScriptRoot\Output\BadADUserList.csv -Force
  }
}

此时,我没有输出文件并收到错误消息:

False
ConvertTo-Csv : Cannot validate argument on parameter 'Delimiter'. The argument is null. Provide a valid value for the argument, and then try running the command again.
At C:\Users\Administrator\Desktop\Drive Encryption Script\Quick Test.ps1:17 char:39
+     {$item | ConvertTo-Csv -Delimiter $delimiter -NoTypeInformation | foreach {  ...
+                                       ~~~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [ConvertTo-Csv], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.ConvertToCsvCommand

我已在此处上传了脚本和示例文件:https://1drv.ms/f/s!Ajx8h3iSP9tuoAz7A37RBUvO7H5H

谢谢大家,非常感谢帮助...

2 个答案:

答案 0 :(得分:0)

以下是对您的剧本的一些更正。

通过管道将对象传递给每个方法可能会更好。执行此操作时,默认对象变量为$ _

$ADUserList = Import-Csv $PSScriptRoot\Output\ADUserList.csv 
$ADUserList | ForEach-Object {
         $item = $_
         IF ($SourceFile1.'User Name'.Length -eq 8 -and $SourceFile1.'User Name' -is [int])
             {$item | ConvertTo-Csv -Delimiter $delimiter -NoTypeInformation | foreach { $i -replace '^"','' -replace "`"$delimiter`"",$delimiter -replace '"$','' }| Out-File $PSScriptRoot\Output\GoodADUserList.csv -Force
         }
         Else 
          {$item | ConvertTo-Csv -Delimiter $delimiter -NoTypeInformation | foreach { $i -replace '^"','' -replace "`"$delimiter`"",$delimiter -replace '"$','' }| Out-File $PSScriptRoot\Output\BadADUserList.csv -Force
             }

答案 1 :(得分:0)

从您下载的文件中,这将分为“(用户名为8个字符和数字)”和“(其他人)”

$users = Import-Csv machineusers.csv

$goodAccounts = @()
$badAccounts = @()

foreach ($user in $users)
{
    if (($user.'User Name'.Length -eq 8) -and 
        ([int]::TryParse($user.'User Name', [ref]$null)))
    {
        $goodAccounts += $user
    } 
    else
    {
        $badAccounts += $user
    }
}
$goodAccounts | Select 'User Name', 'Machine Name' | Export-CSV good.csv -NoTypeInformation
$badAccounts | Select 'User Name', 'Machine Name' | Export-CSV bad.csv -NoTypeInformation

我不知道破坏CSV的所有行的意图,但请不要这样做,必须有更好的方法来实现它。