Скрипт Powershell для определения момента выхода из программы - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть два сценария, которые я хотел бы объединить, но второй сценарий не может начаться, пока не будет закрыта программа (Photoshop). Скрипт один заканчивается запуском скрипта фотошопа с помощью Invoke-Item. Как только скрипт Photoshop будет завершен, PhotoShop закроется. Второй код архивирует необработанные файлы с помощью простого Move-Item. С PowerShell, как я могу узнать, когда PhotoShop закрыт и начать мой Move-Item?

Я потратил некоторое время на изучение этого вопроса, чтобы выяснить, какая документация там есть, но либо я плохо задаю свои вопросы, либо это малоизвестно, и я не могу найти какие-либо указания, с которых можно начать.

# Script One
ii "E:\resizerScript.jsx"

#Something to determine when PhotoShop is closed and begin the next bit of code.

# Script Two
Move-Item -path "E:\Staged\*" -Destination "E:\Archived"

Я очень новичок в кодировании, и то, что у меня есть, вылеплено из других статей. Если что-то слишком непонятно, я с удовольствием уточню. Заранее спасибо за любую помощь или направление.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Вы можете использовать Wait-Process,

Invoke-Item "E:\resizerScript.jsx"
Wait-Process photoshop
Move-Item -Path "E:\Staged\*" -Destination "E:\Archived"

, но я рекомендую использовать Start-Process -Wait для запуска Photoshop.

$photoshopPath = "C:\...\Photoshop.exe"
Start-Process $photoshopPath "E:\resizerScript.jsx" -Wait
Move-Item -Path "E:\Staged\*" -Destination "E:\Archived"

Если вы хотите установить тайм-аут:

Start-Process $photoshopPath "E:\resizerScript.jsx" -PassThru |
    Wait-Process -Timeout (15 * 60) -ErrorAction Stop
0 голосов
/ 10 апреля 2019
  • Во-первых, вам нужно найти имя процесса фотошопа.Откройте PowerShell и запустите

Get-Process | Select-Object -Property ProcessName

  • Затем используйте следующее (конечно, вы можете настроить его в соответствии со своими потребностями, я тестировал с помощью Outlook)
param(
    [string]$procName = "Outlook",
    [int]$timeout = 90, ## seconds
    [int]$retryInterval = 1 ## seconds
)

$isProcActive = $true

$timer = [Diagnostics.Stopwatch]::StartNew()

# to check the process' name:
# Get-Process | Select-Object -Property ProcessName

while (($timer.Elapsed.TotalSeconds -lt $timeout) -and ($isProcActive)) {

    $procId = (Get-Process | Where-Object -Property ProcessName -EQ $procName).Id

    if ([string]::IsNullOrEmpty($procId))
    {
        Write-Host "$procName is finished"
        $isProcActive = $false
    }
}

$timer.Stop()

if ($isProcActive)
{
    Write-Host "$procName did not finish on time, aborting operation..."
    # maybe you want to kill it?
    # Stop-Process -Name $procName
    exit
}

# do whatever

[ОБНОВЛЕНИЕ] если вам нужно поместить это в другой скрипт, вам нужно пропустить param, так как этот должен быть первым в скрипте.Так это будет выглядеть так:

# start of script
$procName = "Outlook"
$timeout = 90 ## seconds
$retryInterval = 1 ## seconds

$isProcActive = $true
# etc etc

Надеюсь, это поможет,

Джим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...