提问人:Nawad-sama 提问时间:10/10/2022 更新时间:10/11/2022 访问量:148
Dynamicly calculated value for scriptproperty
Dynamically calculated value for scriptproperty
问:
下面的脚本是将 msgs 转换为 pdf 的更大项目的一部分。我在实现时遇到的问题是自定义属性。我希望它根据基于消息附件的计算值获取自定义值。不会做。它包括嵌入在消息正文中的图像。这可以通过第二个代码片段来规避。然而,我不能将两者结合起来。attachments
MailItem.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
答:
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-Member
COM 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
评论