我很抱歉,如果这是一个骗子,但经过一段时间的搜索,我找不到适合我的情况的答案。
我有一个python脚本,可以搜索照片中的面孔。 python脚本工作正常,我现在正尝试将其输出合并到一个csv文件中,以用于运行一些统计信息。
输入powershell。
这是我的powershell脚本:
$picts = gci *.jpg
$(foreach ($f in $picts)
{
$obj2 = New-Object System.Object
$obj2 | Add-Member -MemberType NoteProperty -Name fileName -Value $f.Name
$obj2 | Add-Member -MemberType ScriptProperty -Name datumN -Value {
python face_detect_batch.py $f.Name
}
$obj2
}
) | export-csv t.csv
python脚本打印一行,其中包含该文件名以及与照片有关的信息。
我正在其中有两个jpeg,1.jpg和2.jpg的文件夹上测试脚本。如果我在每张照片上手动运行脚本,它将按预期运行。
但是,如果我运行上面的脚本来遍历照片,则会得到以下输出:
#TYPE System.Object
fileName datumN
1.jpg name: 2.jpg; blurScore: 269; facex: 68; facey: 84; faceWidth: 155; faceHeight:155
2.jpg name: 2.jpg; blurScore: 269; facex: 68; facey: 84; faceWidth: 155; faceHeight:155
输出显示脚本按预期进行了迭代,并将两个不同的文件名添加到
$obj2
的filename属性中,但是当执行脚本属性add-member时,两次都给我的python脚本提供了2.jpg。我已经尝试在add-member的value字段中添加
[ref]$f.name
和$global:f.name
,但是这些更改都没有任何区别-我总是将2.jpg传递给我的python脚本。为什么第一个对
$f.Name
的引用按预期枚举文件,而第二个引用仅看到最后一个jpeg? 最佳答案
不要使用ScriptProperty
成员来创建应为其值一次分配的属性,静态-而是使用 NoteProperty
成员:
Get-ChildItem *.txt | ForEach-Object {
[pscustomobject] @{
fileName = $_.Name
datumN = python face_detect_batch.py $_.Name
}
} | Export-Csv t.csv
[pscustomobject] @{ ... }
如何通过哈希表常量间接定义自定义对象,从而简化了其构造。 python face_detect_batch.py $_.Name
的值datumN
只是在构造对象时使用每个输入文件名调用python
,并将结果存储在属性datumN
中,作为一次操作。 [pscustomobject]
实例的属性是NoteProperty
类型的隐式且不变的,即静态值。 至于您尝试了什么:
通过创建
ScriptProperty
成员,您可以分配一段代码,该代码在每次访问属性时都运行。因此,只是到了稍后,当您通过
Export-Csv
导出对象时,才检索到它们的.datumN
属性,从而导致脚本块运行,此时$f
恰好包含了上次迭代的值。关于powershell - Powershell脚本未正确枚举添加成员的脚本属性输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44641194/