arrays - Powershell:将 pracl 命令的输出通过管道传输到数组

标签 arrays powershell command psobject

pracl 是一个 sysinternal 命令,可用于列出目录的 ACL。我有一个共享列表,我想创建一个 csv 文件,这样对于每个 ACL 条目,我希望共享路径位于一列中,共享权限位于下一列中。我试图通过使用以下代码来做到这一点

$inputfile = "share.txt"

$outputFile = "out.csv"

foreach( $path in Get-Content $inputfile)

{

$results=.\pracl.exe $path

      {

foreach ($result in $results) {write-host $path,$line}



      }

$objResult = [pscustomobject]@{

Path = $Path

Permission = $line

}

$outputArray += $objResult

    $objresult

}

$outputArray | Export-Csv -Path $outputfile -NoTypeInformation

由于以下错误而失败:-

Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.

At C:\Users\re07393\1\sample.ps1:14 char:1

+ $outputArray += $objResult

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException

    + FullyQualifiedErrorId : MethodNotFound

有什么建议吗?

最佳答案

您正尝试在 $outputArray 变量中创建一个由 [pscustomobject] 组成的数组< strong>迭代地使用+=,但是您没有将初始化$outputArray作为数组> - 请参阅底部部分以获取对结果行为的解释。

因此,解决您问题的直接方法就是这样做:

# Do this before your `foreach` loop, then `+=` will work for appending elements.
$outputArray = @()

但是,使用 += 添加到数组的效率很低,因为实际上每次都必须创建一个数组实例,因为数组是不可变的数据结构。也就是说,每次使用 += 时,PowerShell 都会在幕后创建一个新的数组实例,现有元素以及新元素都会复制到该实例。

一种更简单、更高效的方法是让 PowerShell 为您创建一个数组,使用 foreach 循环作为表达式 并将其作为一个整体分配给变量: 也就是说,PowerShell 会自动收集循环每次迭代中的输出:

一个简化的例子:

# Create an array of 10 custom objects
[array] $outputArray = foreach ($i in 1..10) {
   # Create and implicitly output a custom object in each iteration.
   [pscustomobject] @{
     Number = $i
   }
}

请注意 $outputArray 左侧使用类型约束 [array],它确保变量值始终是一个数组,即使循环碰巧只生成一个输出对象(在这种情况下,PowerShell 将仅存储该对象本身,而不是将其包装在数组中)。

请注意,您可以类似地使用 forifdo/while/switch 语句作为表达式

但是,在所有情况下,这些语句只能用作表达式本身;遗憾的是,将它们用作管道的第一段或将它们嵌入到更大的表达式中确实不起作用 - 请参阅 GitHub issue #6817 .


至于你尝试过的:

$outputArray += $objResult

由于您没有在循环之前初始化 $outputArray,因此该变量会在循环的第一次迭代中隐式创建:

如果 LHS 变量尚不存在,则 += 实际上与 = 相同:即,RHS 按原样存储在 LHS 变量中,这样 $outputArray 现在包含一个 [pscustomobject] 实例。

第二次迭代中,由于$outputArray现在有了一个值,+=现在尝试执行适合类型的 + 操作(例如数字的数字加法和字符串的连接),但没有为 类型定义 + (op_Addition()) 操作[pscustomobject],因此操作失败并显示您看到的错误消息。

关于arrays - Powershell:将 pracl 命令的输出通过管道传输到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59277625/

相关文章:

powershell - 如何使用 PowerShell 从文件名中删除句点?

parsing - 需要帮助编写批处理文件来读取带有空分隔符的 MS Access .ldb 锁定文件

batch-file - 批量删除目录而不使用回收站

arrays - 包含整数的数组的排列变体

powershell - 使用 Powershell 的用户登录/注销信息

c - 在 C 中我可以声明一个常量字符数组吗?

powershell - PowerShell 中带有序列号的 Padleft 函数

linux - unix复制/下载进度状态更新

c# - 将 char[,] 数组转换为 char**

c - `restrict` 关键字隐含的严格别名级别是什么?