Dynamicly calculated value for scriptproperty

Dynamically calculated value for scriptproperty

提问人:Nawad-sama 提问时间:10/10/2022 更新时间:10/11/2022 访问量:148

问:

下面的脚本是将 msgs 转换为 pdf 的更大项目的一部分。我在实现时遇到的问题是自定义属性。我希望它根据基于消息附件的计算值获取自定义值。不会做。它包括嵌入在消息正文中的图像。这可以通过第二个代码片段来规避。然而,我不能将两者结合起来。attachmentsMailItem.Attachments.Count

主脚本:

$o = new-object -comobject outlook.application
$path = "PATH"
cd $path
gc test.csv|Select -skip 2 -First 1|%{$_|Add-Member -MemberType NoteProperty -Name 'BaseName' -Value $_.substring($_.Lastindexof('\')+1).substring(0, $_.substring($_.Lastindexof('\')+1).Lastindexof('.'));
$_|Add-Member -MemberType NoteProperty -Name 'FileName' -Value $_.substring($_.Lastindexof('\')+1);
$_|Add-Member -MemberType NoteProperty -Name 'FullName' -Value $_;
$_|Add-Member -MemberType NoteProperty -Name 'Folder' -Value $_.substring(0, $_.Lastindexof('\'));
$_|Add-Member -MemberType ScriptProperty -Name 'New Loc' -Value {if($msg.Attachments.Count -eq 0){$msgDirectory + '\Converted\'}elseif($msg.Attachments.Count -ge 1){$msgDirectory + '\Converted\' + $msgBaseName + '\'}};





$_|Add-Member -MemberType ScriptProperty -Name 'Attachments' -Value {IF ((SECOND SNIPPET) -gt 0){"YES"}ELSE{"NO}};




$msgBaseName = $_.BaseName
$msgFullname = $_.FullName
$msgDirectory = $_.Folder
$msgName = $_.Filename

$msg = $o.CreateItemFromTemplate($msgFullname)
}

第二部分:

$results = 0
$msg.Attachments|%{$att = $_
$attach = $att.FileName; 
$file = 'C:\Users\anowak\Downloads\Script_Test\' + $attach
$file
IF(($msg.HTMLBody) -like "*cid:$attach*"){}else{$results ++} #check if 'attachment' present in the body
$results
PowerShell scriptblock 自定义属性 添加成员

评论


答:

0赞 Nawad-sama 10/10/2022 #1

显然,这将解决问题。

$o = new-object -comobject outlook.application
$path = "Path"
cd $path

$output = @()

gc test.csv |
  Select -skip 3 -First 1 | 
  % { 

    $_ | Add-Member -MemberType NoteProperty -Name 'BaseName' -Value $_.substring($_.Lastindexof('\') + 1).substring(0, $_.substring($_.Lastindexof('\') + 1).Lastindexof('.'))
    $_ | Add-Member -MemberType NoteProperty -Name 'FileName' -Value $_.substring($_.Lastindexof('\') + 1)
    $_ | Add-Member -MemberType NoteProperty -Name 'FullName' -Value $_
    $_ | Add-Member -MemberType NoteProperty -Name 'Folder' -Value $_.substring(0, $_.Lastindexof('\'))
    $_ | Add-Member -MemberType ScriptProperty -Name 'New Loc' -Value { if ($msg.Attachments.Count -eq 0) { $msgDirectory + '\Converted\' }elseif ($msg.Attachments.Count -ge 1) { $msgDirectory + '\Converted\' + $msgBaseName + '\' } }

    $msgBaseName = $_.BaseName
    $msgFullname = $_.FullName
    $msgDirectory = $_.Folder
    $msgName = $_.Filename

    $msg = $o.CreateItemFromTemplate($msgFullname)

    $results = 0
    $msg.Attachments | 
      % { 
        $att = $_
        $attach = $att.FileName
        $file = 'Path' + $attach
        IF (($msg.HTMLBody) -like "*cid:$attach*") {} else { $results++ } #check if 'attachment' present in the body
        $results
      }
  
    $_ | Add-Member -MemberType ScriptProperty -Name 'Attachments' -Value { if ($results -eq 0) { 'NO' } else { 'Yes' } };

    $output += $_ | Select FullName, FileName, "New Loc", Attachments

  }

$output | Out-GridView

解释我做了什么。我把“第二部分”放在前面,以便进行计算。我已经测试过了,可以正常工作。唯一的问题是我每次都必须重新启动ISE。否则,变量将保持填充状态,脚本将无法按预期工作。Add-MemberCOM Object$results

评论

0赞 mklement0 10/10/2022
顺便说一句:在循环中扩展数组是低效的,因为考虑到数组的大小是固定的,因此每次迭代都必须在幕后创建一个数组;更有效的方法是让 PowerShell 本身在数组中收集输出: - 请参阅此答案。如果您需要手动创建数组,例如要创建多个数组,请使用高效可扩展的列表类型 - 请参阅此处+=[array] $outputs = gc test.csv ...
0赞 mklement0 10/10/2022
顺便说一句:PowerShell ISE 不再积极开发,并且有理由不使用它(底部),特别是无法运行 PowerShell (Core) 6+。提供最佳 PowerShell 开发体验的积极开发的跨平台编辑器是 Visual Studio Code 及其 PowerShell 扩展
0赞 mklement0 10/10/2022
共享解决方案固然很棒,但代码的格式设置使得很难理解正在发生的事情。考虑使用适当的缩进并插入空行以改善结构。
0赞 Nawad-sama 10/10/2022
这些都是很好的论据,但是......我不能使用 5.1.19041.1682 以上的 enything。公司设备 - 没有更新的管理员权限。VS也一样。不过,我会看到你提到的帖子。谢谢
1赞 Nawad-sama 10/11/2022
@mklement0 我认为是域用户设置阻止了安装,但我不是这方面的专家。至于使用,我用原来的解决方案和对象测量了脚本。对于少量文件(测试组中有 6 个文件)来说,7 毫秒的差异似乎微不足道,但它会堆积起来。谢谢。您的格式使我的代码看起来更具可读性。再次感谢。[system.colletions.arraylist]+=arraylist