Powershell - 计算隐藏的Powerpoint幻灯片

时间:2015-11-04 00:09:53

标签: powershell powerpoint

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的翻译已经完成了我的工作,它显然不起作用!获得一些隧道视野和我们有限的互联网接入也阻碍了进步。如果任何人都可以看看,并告诉我什么是多余的,我可能会错过什么,将不胜感激。谢谢,

1 个答案:

答案 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"