Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName Office
Add-Type -AssemblyName Microsoft.Office.Interop.Powerpoint
#Getting Error - Add-Type -AssemblyName Office Microsoft.Office.Interop.Powerpoint.Slide.SlideShowTransition.Hidden
Function RunSlide {
$pptx = "h:\Test.ppt"
$osld = "Slide"
[bool] $sldState = "Slide.SlideShowTransition.Hidden"
$state = "False"
$hiddenCount = 0
$cc = 0
$application = New-Object -ComObject powerpoint.application
$presentation = $application.Presentations.open($pptx)
$count = 1
Start-Sleep -Seconds 3
ForEach ($osld In $Presentation.Slides)
{
$cc = $cc + 1
If ($sldState -eq "False") {$hiddenCount = $hiddenCount + 1; Write-Host "Slide State $sldState"}
Write-Host "Hidden Count is $hiddenCount"
$endCount = $presentation.Slides.Count
Write-Host "Total slide count is $endCount"
#Present Slide Show
[System.Windows.Forms.SendKeys]::SendWait("{F5}")
do
{
Start-Sleep -Seconds 6
[System.Windows.Forms.SendKeys]::SendWait("{RIGHT}")
$count = $count + 1
Write-Host "Slide Count is $count"
}
while ($count -le $endCount)
Write-Host "POWER POINT RESTARTING"
Stop-Process -processname POWERPNT
}
$b -eq 1
do {
$d = Get-Date
Write-Host "Slide ran as at $d"
CheckSlide
RunSlide
Start-Sleep -Seconds 3
}
While ($b = 1)
所以我限制使用powershell(新工作策略),因此我们将现有的wscript和vbscript文件改编为Powershell。
我们有一个信息墙,它使用指向powerpoint演示文稿的超链接。它会定期更新,因此需要打开,显示然后关闭并重新打开。
到目前为止,我已成功实现这一目标。但由于隐藏幻灯片的数量和我的代码的性质,脚本有时运行的时间远远超过它(有时多达40张幻灯片)。
我的脚本检查POWERPOINT进程是否正在运行,如果没有,则继续并打开该文件。然后它会进行幻灯片计数,并按演示文稿的长度运行演示文稿(添加计数直到达到总计)。
一旦完成,它将停止进程,底部的Do循环将再次打开文件。冲洗重复。
问题是,总幻灯片计数还会计算隐藏的幻灯片。
我想用ForEach循环实现的目的是让脚本查看每个幻灯片状态,如果隐藏它会增加计数。从总数中减去此计数,Do循环使用此计数,然后显示正确数量的显示幻灯片。现在ForEach循环只报告计数,而不是减去(因为我无法计算隐藏的数量)
我意识到可能有更简单的演示方法,但从Vb到PS的翻译已经完成了我的工作,它显然不起作用!获得一些隧道视野和我们有限的互联网接入也阻碍了进步。如果任何人都可以看看,并告诉我什么是多余的,我可能会错过什么,将不胜感激。谢谢,
答案 0 :(得分:1)
我不明白你认为[bool] $sldState = "Slide.SlideShowTransition.Hidden"
应如何运作。
你正在转动( cast )一个字符串(实际上所有幻灯片总是相同)到一个布尔值;这将始终评估为$true
。
我建议删除该ligne并在ForEach
循环中尝试:
(...)
$cc++ # equivalent to $cc = $cc + 1
$sldState = $osld.SlideShowTransition.Hidden
if($sldState) { # equivalent to if($sldState -eq $true)
$hiddenCount++
Write-Host "Slide State $sldState"
}
Write-Host "Hidden Count is $hiddenCount"
(...)
$sldState
现在,对于每张幻灯片,获取当前幻灯片对象SlideShowTransition.Hidden
上的$osld
属性(根据MSDN看似正确)。
我想你也可以通过直接计算非隐藏幻灯片来简化事情,如下所示:
$presentation.Slides | ForEach-Object {
if(-not $_.SlideShowTransition.Hidden) {
$visibleSlidesCount++
}
}
Write-Host "There are $visibleSlidesCount visible slides in this presentation"