powershell脚本没有正确枚举add-member的scriptproperty输入

时间:2017-06-19 22:59:56

标签: powershell

我很抱歉,如果这是一个骗局,但在搜索了一段时间之后,我找不到能够解决问题的答案。

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

1 个答案:

答案 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碰巧包含最后迭代的值。