5

我是 powershell 新手,需要帮助。我的第一个工作脚本是自动化 AD 环境中的新用户和术语用户。

我们的 Peoplesoft 系统每天将进行一次 CSV 转储。我使用Import-CSV并创建了 3 个数组(新的、长期的和已处理的)。

我遇到的麻烦是,一旦我遍历所有用户并尝试将其放回文件中,就组合 3 个数组。代码在行处中断$New += $Term。我相信这是因为在我的测试文件中每种用户类型(新的、长期的和已处理的)只有 1 条记录(我知道,添加更多用户......不能。这可能是任何人的真实世界结果特定的日子)。下面是我的示例代码:

#Get Credentials from user
$c = Get-Credential

#Get Date for $Term array population
$e = Get-Date -format M/d/yyyy

#Set file location and variable for said file
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv"

#Import record sets for New and Term users
$New   = @()
$Term  = @()
$Procd = @()
$New   = Import-Csv $File | Where-Object {
           $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""
         }
$Term  = Import-Csv $File | Where-Object {
           $_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e
         }
$Procd = Import-Csv $File | Where-Object { $_.Processdate -ne "" }

#Process both new and term users provided there are records to process for each
If ($New -ne $NULL -and $Term -ne $NULL) {
  # Some code to process users
}

$new += $term
$new += $Procd
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue

所以它会导出但只是部分结果。

错误 - 方法调用失败,因为 [System.Management.Automation.PSObject] 不包含名为“op_Addition”的方法。

4

4 回答 4

11

如果Import-Csv只返回 1 个结果,那么假设变量不是数组是正确的,那么连接将失败。这不会因为您已使用 预初始化变量而改变@()。事实上,这一步是不必要的。

要强制将结果视为数组,您可以将整Import-Csv行包装在 中@(),或者之后执行类似的操作。

$new = @( Import-Csv $File | Where-Object {...} )
# or
$new = Import-Csv $File | Where-Object {...}
$new = @($new)
于 2013-02-15T22:02:31.400 回答
1

所以你要导入同一个 CSV 文件 3 次?将它导入一次然后将数组设置为过滤它的“视图”不是更好吗?

有点像这样。您还应该能够使用每个数组中的“计数”值来说明是否返回了 1 个或多个结果。

#Get Credentials from user
$c = Get-Credential

#Get Date for $Term array population
$e = Get-Date -format M/d/yyyy

#Set file location and variable for said file
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv"

#Import record sets for New and Term users
[array]$New
[array]$Term
[array]$Procd

[array]$Import = Import-Csv $File
[array]$New = $Import | ? {$_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""}
[array]$Term = $Import | ? {$_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e}
[array]$Procd = $Import | ? {$_.Processdate -ne ""}

#Process both new and term users provided there are records to process for each
if (($New.Count -gt 0) -and ($Term.Count -gt 0))
{
    # Some code to process users
}

$new += $term
$new += $Procd
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue
于 2013-02-17T21:36:48.220 回答
0

我知道我迟到了这个讨论,但是对于其他人来说......由于您已经将 $new 定义为一个空数组,因此当您从 csv 导入时,您希望将输出添加到您的预定义数组,而不是将其设置为等于 import-csv 的输出。

$new = @()
$new += Import-Csv $File | Where-Object {
           $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""
         }
于 2013-11-08T20:12:20.647 回答
0

您还可以通过类型转换变量来强制类型:

$array = @()
$array = gci test.txt
$array.GetType()

[array]$array = @()
$array = gci test.txt
$array.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True FileInfo System.IO.FileSystemInfo
True True Object[] System.Array

于 2013-02-16T04:06:37.060 回答