Arrays Powershell:pracl命令到阵列的管道输出
pracl是一个sysinternal命令,可用于列出目录的ACL。我有一个共享列表,我想创建一个csv文件,这样对于每个ACL条目,我想在一列中显示共享路径,在下一列中显示共享权限。我试图通过使用以下代码来实现这一点Arrays Powershell:pracl命令到阵列的管道输出,arrays,powershell,command,psobject,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 { foreac
$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]
数组,但是您没有将$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只存储该对象本身,而不将其包装在数组中)
请注意,您可以类似地使用for
,if
,do
/,而/switch
语句作为表达式
但是,在所有情况下,从PowerShell 7.0开始,这些语句本身只能用作表达式;遗憾的是,将它们用作管道的第一段或将它们嵌入到更大的表达式中是行不通的-请参阅
至于你所尝试的:
$outputArray+=$objResult
由于在循环之前没有初始化$outputArray
,因此在循环的第一次迭代中隐式创建变量:
如果LHS变量还不存在,+=
实际上与=
相同:也就是说,RHS存储在LHS变量中,因此$outputArray
现在包含一个[pscustomobject]
实例
在第二次迭代中,由于$outputArray
现在有一个值,+=
现在尝试执行类型适当的+
操作(例如数字的数字加法和字符串的串联),但是没有为类型[pscustomobject]
定义+
(op_addition()
)操作,因此,操作失败,并显示您看到的错误消息