2015-11-04 3 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 - Подсчет Hidden Powerpoint Слайды

У нас есть информационная стена, которая использует гиперссылку на презентацию PowerPoint. Он регулярно обновляется, поэтому он должен открываться, присутствовать, затем закрываться и снова открываться.

До сих пор мне удалось это сделать. Но из-за количества скрытых слайдов и характера моего кода скрипт будет работать намного дольше, чем он есть (иногда до 40 слайдов).

Мой скрипт проверяет, работает ли процесс POWERPOINT, а затем он продолжает работу и открывает файл. Затем он выполнит подсчет слайдов и запустит презентацию для длины презентации (добавляет счетчик до достижения полного).

Закончив работу, он остановит процесс, а цикл «До» в нижней части откроет файл снова. Повторное полоскание.

Проблема заключается в том, что общее число слайдов также учитывает скрытые слайды.

То, что я пытаюсь достичь с помощью цикла ForEach, - это сценарий для просмотра каждого состояния слайда, если он скрыт, он добавляет к счету. Этот счет вычитается из общего числа, а цикл Do использует этот счет, чтобы представить правильное количество показанных слайдов. Прямо сейчас цикл ForEach просто сообщает счет, а не вычитает (потому что я еще не могу его подсчитать, чтобы подсчитать скрытую сумму)

Я понимаю, что могут быть более простые методы для презентации, но перевод с Vb на PS сделал мой голова в, это просто не работает! Получение определенного вида туннеля и ограниченный доступ к Интернету, который у нас есть, также препятствуют прогрессу. Если кто-то может взглянуть и рассказать, что лишнее, и что я, возможно, пропустил, что было бы очень признательно. Спасибо,

+2

Моя первая догадка это всегда будет оценивать до $ True: [BOOL] $ sldState = «Slide.SlideShowTransition .Hidden " –

ответ

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 теперь, для каждого слайда, получить SlideShowTransition.Hidden свойства текущего объекта слайда $osld (кажется правильным в соответствии с MSDN).

Я думаю, вы могли бы также упростить вещи, непосредственно считая НЕРАСПРОСТРАНЕНИИ скрытых слайдов, например:

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

Это ответ на это красиво. Теперь я понимаю, почему это всегда возвращалось. Пригвоздил его по голове. Я пробовал ваши изменения в цикле ForEach и продолжал получать нулевое значение (не знаю почему), поэтому я дал упрощенную версию. «-не почему-то не сработало (опять-таки не уверен, почему), поэтому я изменил его на if ($ _. SlideShowTransition.Hidden -eq $ false), и это дало мне количество видимых слайдов. Добавлен к окончательному счету, и он работал красиво. Спасибо за быстрый ответ, а $ string ++ - это откровение. Приветствия. – treaddy

+0

Если вам нужна дополнительная информация, я буду рад помочь вам – sodawillow

Смежные вопросы