我很抱歉,如果这是一个骗局,但在搜索了一段时间之后,我找不到能够解决问题的答案。
我有一个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的值字段中提供[ref]$f.name
和$global:f.name
,但没有任何更改有任何区别 - 我总是将2.jpg传递给我的python脚本。< / p>
为什么对$f.Name
的第一次引用按预期枚举文件,但第二次引用只能看到最后一个jpeg?
答案 0 :(得分:2)
请勿使用ScriptProperty
成员创建一个属性,其值应分配一次,静态 - 而是使用 {{1成员:
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
中的em> result ,作为一次性操作。
生成的datumN
实例的属性隐式且不变,类型为[pscustomobject]
,即静态值。
至于您尝试的内容:
通过创建NoteProperty
成员,您可以在每次访问该媒体资源时分配运行的代码 。
因此,只有在ScriptProperty
导出对象时,他们的Export-Csv
属性被检索才会导致脚本块运行然后,此时.datumN
碰巧包含最后迭代的值。