【问题标题】:Powershell - Counting Hidden Powerpoint SlidesPowershell - 计算隐藏的 Powerpoint 幻灯片
【发布时间】:2015-11-05 02:27:28
【问题描述】:
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 的翻译已经让我头疼了,这根本不起作用!获得一些隧道视野和有限的互联网接入也阻碍了进展。如果有人可以看一下并说出多余的内容以及我可能遗漏的内容,将不胜感激。谢谢,

【问题讨论】:

  • 我的第一个猜测是这将始终评估为 $true: [bool] $sldState = "Slide.SlideShowTransition.Hidden"

标签: powershell powerpoint


【解决方案1】:

我不明白你认为[bool] $sldState = "Slide.SlideShowTransition.Hidden" 应该如何工作。

您正在将 (casting) 字符串(实际上对于所有幻灯片始终相同)转换为布尔值;这将始终被评估为$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 现在将为每张幻灯片获取当前幻灯片对象$osld 上的SlideShowTransition.Hidden 属性(根据MSDN 似乎是正确的)。

我想你也可以通过直接计算非隐藏幻灯片来简化事情,就像这样:

$presentation.Slides | ForEach-Object {
    if(-not $_.SlideShowTransition.Hidden) {
        $visibleSlidesCount++
    }
}
Write-Host "There are $visibleSlidesCount visible slides in this presentation"

【讨论】:

  • 这很好地回答了它。我现在明白为什么它总是返回真实。把它钉在头上。我尝试了您对 ForEach 循环的修改并不断得到一个空值(不确定为什么),所以我试了一下简化版本。 -not 由于某种原因不起作用(再次不确定为什么),所以我将其更改为 if($_.SlideShowTransition.Hidden -eq $false) ,这给了我可见幻灯片的数量。添加到最终计数中,它工作得很好。感谢您的快速响应,$string++ 是一个启示。干杯。
  • 如果您需要任何其他信息,我很乐意为您提供进一步的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多