Powershell:如何从csv中检索powershell命令并逐一执行,然后将结果输出到新的csv

Jia*_*ann 2 csv powershell

我有一个 Commands.csv 文件,例如:

| Command                                        |
| -----------------------------------------------|
|(Get-FileHash C:\Users\UserA\Desktop\File1).Hash|
|(Get-FileHash C:\Users\UserA\Desktop\File2).Hash|
|(Get-FileHash C:\Users\UserA\Desktop\File3).Hash|
Run Code Online (Sandbox Code Playgroud)

标头名称为“命令”

我的想法是:

  1. 使用ForEach ($line in Get-Content C:\Users\UserA\Desktop\Commands.csv ) {echo $line}
  2. 通过powershell.exe逐一执行$line,然后将结果输出到一个新的.csv文件——“result.csv”

您能给我一些实施这个想法的指导和建议吗?谢谢!

mkl*_*nt0 5

重要的

  • 仅对您完全控制或隐式信任不包含恶意命令的输入文件使用以下技术。

  • 要执行存储在字符串中的任意 PowerShell 语句,您可以使用Invoke-Expression,但请注意,通常应该避免使用它,因为通常有更好的替代方案 - 请参阅此答案

  • 有一些高级技术可以让您在执行语句之前对其进行分析,和/或让您使用具有限制性语言模式的单独运行空间,该限制性语言模式限制允许执行的语句类型,但这超出了本答案的范围。


  • 鉴于您的输入文件是一个.csv带有列的文件Commands,请将其导入Import-Csv并访问.Commands结果对象的属性。

    • Get-Content仅当您的输入文件是没有标题行的纯文本文件时才使用,在这种情况下,扩展名实际上应该是.txt. (如果它有标题行但只有列,您可以逃脱Get-Content Commands.csv | Select-Object -Skip 1 | ...)。如果是这种情况,请使用$_而不是$_.Commands下面的。
  • 要同时使用 CSV 格式作为输出文件,所有命令必须生成相同类型或至少具有相同属性集的对象。问题中的示例命令输出字符串(属性的值),该字符串无法有意义地直接.Hash传递给,因此使用带有属性的包装器,这将生成一个包含名为 的单列的 CSV 文件。Export-Csv [pscustomobject]ResultResult

Import-Csv Commands.csv |
  ForEach-Object {
    [pscustomobject] @{ 
      # !! SEE CAVEAT AT THE TOP.
      Result = Invoke-Expression $_.Commands 
    }
  } |
  Export-Csv -NoTypeInformation Results.csv
Run Code Online (Sandbox Code Playgroud)