2015-11-04 105 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