如何使用 powershell 将信息添加到行和 csv?

how to add information to a row and csv with powershell?

我有一个包含 3 列 SID、SamAccount 名称、已启用的 csv 文件。 我还有一个文件夹,其中包含以“UVHD-”+SID 组合方式调用的文件。 我尝试用 Length、LastWriteTime 更新 csv 文件 所以它会像这样例如:

SID     SAMAccountName     Enabled      Length      LastWriteTime
S-...   FelixR             False        205520896   02/02/2021  9:13:40

我试了很多东西都失败了 这是我能得到的最好的:

Import-Csv $path\SID-ListTEST2.csv | select -ExpandProperty SID | ForEach-Object { Get-Childitem –Path $path\"UVHD-"$_.vhdx | Export-Csv $path\SID-ListTEST2.csv -Append | where $_   }

使用calculated properties:

(
  Import-Csv $path\SID-ListTEST2.csv | 
    Select-Object *, 
                  @{ 
                    Name='LastWriteTime';
                    Expression={ (Get-Item "$path\UVHD-$($_.SID).vhdx").LastWriteTime } 
                  }
) | # Export-Csv -NoTypeInformation -Encoding utf8 $path\SID-ListTEST2.csv

输出到显示器;从最后一行删除 # 以改为导出到 CSV 文件。
注意管道周围的 (...),它确保所有输出都被预先收集 ,这是将结果 保存回原始输入文件的先决条件。请注意,原始字符编码不一定会保留 - 使用 -Encoding 指定所需的编码。

这增加了一个额外的属性,LastWriteTime;类似地构造其他的。

为了提高性能,您可以缓存 Get-Item 调用的结果,这样就不必在每次计算时都重复属性:在最简单的情况下,在 中使用 ($script:file = Get-Item ...) first 计算 属性,然后您可以将其重用为 $script:file(或只是 $file) 在后续的。请注意,$script: 范围修饰符是必需的,因为 child 范围中的计算属性 运行 的脚本块。[1]

请注意,如果不存在匹配文件,Get-Item 调用将静默 失败并默认为 $null


[1] 因此,更稳健但更麻烦的方法是使用 Set-Variable -Scope 1 file (Get-Item ...) 而不是 $script:file = Get-Item ...,以确保变量是在直接父作用域,无论它是什么。