2015-11-04 100 views
3
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。Powershell - 计数隐藏的Powerpoint幻灯片

我们有一个信息墙,使用超级链接到PowerPoint演示文稿。它会定期更新,因此需要打开,然后关闭并重新打开。

到目前为止,我设法做到了这一点。但是由于隐藏幻灯片的数量和我的代码的性质,脚本有时会比它运行的时间长得多(有时可能会多达40个幻灯片)。

我的脚本检查POWERPOINT进程是否正在运行,如果没有,则继续并打开文件。然后,它会做一个幻灯片计数,并运行演示文稿的演示文稿的长度(增加计数,直到它达到总数)。

一旦完成它将停止进程,底部的Do循环将再次打开文件。冲洗重复。

问题是,总幻灯片计数也计算隐藏的幻灯片。

我试图用ForEach循环实现的是让脚本查看每个幻灯片状态,如果隐藏它将添加到计数。从总数中减去此计数,Do循环使用此计数来呈现正确数量的显示幻灯片。现在,ForEach循环只是报告计数,而不是减法(因为我不能计算隐藏的数量)

我意识到可能有更简单的演示方法,但是从Vb到PS的转换已经完成了我的工作进来,这只是简单的不工作!获得一些隧道视野和我们有限的互联网接入也阻碍了进步。如果任何人都可以看看,并告诉什么是多余的,我可能错过了什么,将不胜感激。谢谢,

+2

我的第一个猜测是,这将始终评估为$ true:[BOOL] $ sldState =“Slide.SlideShowTransition .Hidden“ –

回答

1

我不明白你应该怎么工作[bool] $sldState = "Slide.SlideShowTransition.Hidden"

您正在转向(铸造)一个字符串(对于所有幻灯片实际上总是相同的)转换为布尔值;这总是会被评估为$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" 
+0

这个回答很漂亮。我现在明白为什么它总是回归真实。钉在它的头上。我尝试了对ForEach循环的修改并保持null值(不确定原因),所以我给了简化版本一个镜头。 - 由于某种原因不起作用(再次不确定为什么),所以我将其更改为if($ _。SlideShowTransition.Hidden -eq $ false),这给了我可见幻灯片的数量。增加到最后的计数,它工作得很好。感谢您的快速响应,$ string ++是一个启示。干杯。 – treaddy

+0

如果您需要任何其他信息,我们很乐意为您提供进一步的帮助 – sodawillow