我很抱歉,如果这是一个骗子,但经过一段时间的搜索,我找不到适合我的情况的答案。

我有一个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/

    10-14 13:12
    查看更多