我是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
谢谢大家,非常感谢帮助...
答案 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的所有行的意图,但请不要这样做,必须有更好的方法来实现它。