Как передать несколько параметров в PowerShell Start-Job для запуска процесса в фоновом режиме? - PullRequest
0 голосов
/ 12 июня 2018

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

function Send-DBBackupToS3
{
  param(
    [Parameter(Mandatory=$true)][string]$p1, 
    [Parameter(Mandatory=$true)][string]$p2, 
    [Parameter(Mandatory=$true)][string]$p3
  )
  try
  { 
    Write-Host "starting process..."
    $TransferAppExe = $p1
    $arguments = '-OnDiskPath', $p2, '-NotificationEmailAddress', $p3
    $ps = Start-Process -FilePath $TransferAppExe -ArgumentList $arguments -Wait -PassThru               
  }
  catch
  {
      # get error record
      [Exception]$e = $_

      # retrieve information about runtime error
      $info = [PSCustomObject]@{
          Exception = $e.Exception.Message
          Reason    = $e.CategoryInfo.Reason
          Target    = $e.CategoryInfo.TargetName
          Script    = $e.InvocationInfo.ScriptName
          Line      = $e.InvocationInfo.ScriptLineNumber
          Column    = $e.InvocationInfo.OffsetInLine
          }
      # output information. Post-process collected info, and log info (optional)
      $info
  }        
}
function Start-DBCopyAndTransfer
{        
    param(     
      [Parameter(Mandatory)]   
      [string]$AppPath,
      [Parameter(Mandatory)]
      [string]$UploadFilePath,
      [Parameter(Mandatory)]
      [string[]]$EmailAddress
    )               
    Write-Host "calling job..."
    Start-Job -Name Send2S3 -ScriptBlock {param($p1, $p2, $p3) Send-DBBackupToS3 -p1 $p1 -p2 $p2 -p3 $p3} -ArgumentList $AppPath,$UploadFilePath,$EmailAddress          
}
Clear-Host

Write-Host "calling function..."
Start-DBCopyAndTransfer -AppPath "C:\FileToS3.exe" -UploadFilePath "C:\chron.cti" -EmailAddress "4321@gmail.com"

Я пытаюсь передать в командлет Start-Process параметры, необходимые для запуска .exe.

Результаты у меня следующие:

calling function...
calling job...

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      Send2S3         BackgroundJob   Running       True            localhost            param($p1, $p2, $p3) S...



PS C:\WINDOWS\system32> Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      Send2S3         BackgroundJob   Failed        False           localhost            param($p1, $p2, $p3) S...



PS C:\WINDOWS\system32> 

Я никогда не вижу Write-Host "процесс запуска ..." огонь.Если я уберу параметры (Жесткий код значений) из Send-DBBackupToS3 , все будет работать нормально.Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я не хочу отвечать на свои вопросы ... Однако, если кто-то сталкивается с этим, я хочу, чтобы у них было решение.

$func = {
  function Send-DBBackupToS3
  {
    param(
      [Parameter(Mandatory=$true)][string]$p1, 
      [Parameter(Mandatory=$true)][string]$p2, 
      [Parameter(Mandatory=$true)][string]$p3
    )
    try
    { 
      Write-Host "starting process..."
      $TransferAppExe = $p1
      $arguments = '-OnDiskPath', $p2, '-NotificationEmailAddress', $p3
      Start-Process -FilePath $TransferAppExe -ArgumentList $arguments -Wait -PassThru            
    }
    catch
    {
      # get error record
      [Exception]$e = $_

      # retrieve information about runtime error
      $info = [PSCustomObject]@{
          Exception = $e.Exception.Message
          Reason    = $e.CategoryInfo.Reason
          Target    = $e.CategoryInfo.TargetName
          Script    = $e.InvocationInfo.ScriptName
          Line      = $e.InvocationInfo.ScriptLineNumber
          Column    = $e.InvocationInfo.OffsetInLine
          }
      # output information. Post-process collected info, and log info (optional)
      $info
    }        
  }
}
function Start-DBCopyAndTransfer
{        
    param(     
      [Parameter(Mandatory)]   
      [string]$AppPath,
      [Parameter(Mandatory)]
      [string]$UploadFilePath,
      [Parameter(Mandatory)]
      [string[]]$EmailAddress
    )               
    Write-Host "calling job..."
    $job = Start-Job -Name Send2S3 -InitializationScript $func -ScriptBlock {param($p1, $p2, $p3) Send-DBBackupToS3 -p1 $p1 -p2 $p2 -p3 $p3} -ArgumentList $AppPath,$UploadFilePath,$EmailAddress          
    Receive-Job -Job $job
    Write-Host ('State: {0}' -f $job.State)
}
Clear-Host

Write-Host "calling function..."
Start-DBCopyAndTransfer -AppPath "C:\FileToS3.exe" -UploadFilePath "C:\chron.cti" -EmailAddress "4321@gmail.com"
0 голосов
/ 12 июня 2018

Вы можете передать несколько аргументов следующим образом:

Start-Process -FilePath $TransferAppExe -ArgumentList $argument1, $argument2, $argument3 -Wait -PassThru

Или передать список аргументов:

$arguments = $argument1, $argument2, $argument3
Start-Process -FilePath $TransferAppExe -ArgumentList $arguments -Wait -PassThru

Или передать одну строку со всеми аргументами:

Start-Process -FilePath $TransferAppExe -ArgumentList "$argument1 $argument2 $argument3" -Wait -PassThru

Кроме того, вам не нужно WaitForExit, если у вас есть аргумент -Wait, поскольку они делают то же самое.

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