2013-05-28 3 views
1

В названии говорится, что у меня есть начальная работа с блоком сценария, который вместо выполнения команд выводит информацию о задании.Powershell Start-Job не исполняет scriptblock

Порядок, в котором это запускается на выполнение заключается в следующем

$location = $(Get-Location).toString() 

$oldModulePath = $env:PSModulePath 
$env:PSModulePath = $env:PSModulePath + ";" + $location + "\LongitudePowershellModules" 

$env:PSModulePath 

$configXML = [xml](Get-Content $location"\InstallationConfig.XML") 
$config = $configXML.root 

Import-Module CreateComponentsFolder -PassThru 
Import-Module CreateTransferFolder -PassThru 
Import-Module ConfigureDB -PassThru 
Import-Module FastProxyTools -PassThru 
Import-Module WspTools -PassThru 
Import-Module CopySharepointPowershellXML -PassThru 
Import-Module SearchCenterTools -PassThru 
Import-Module ConfigureFAST -PassThru 

# 1 - CreateComponentsFolder 

CreateLongitudeComponentsFolder -currentLocation $location 

И модуль с запуском задания

function CreateLongitudeComponentsFolder 
{ 
    Param(
     [Parameter(Mandatory=$True, Position=1)] 
     [string]$currentLocation 
    ) 

    $scriptBlock = {Write-Host "Copying files to '"C:\Program Files\Ba-insight\Longitude Fast Component"'"` 

      Copy-Item $currentLocation"\Longitude Fast Component" "C:\Program Files\Ba-insight\Longitude Fast Component" -recurs` 
    } 


    Start-Job -ScriptBlock $scriptBlock -ArgumentList $currentLocation -Name "CopyingFiles" 

    $scriptBlock = {$fileAndFolderList = Get-ChildItem $currentLocation"\Longitude Fast Component" -recurs 
     $targetLocationFileAndFolderList = Get-ChildItem "C:\Program Files\Ba-insight\Longitude Fast Component" -recurs 

     $timer = new-object System.Timers.Timer 
     $timer.Interval = 500 #0.5 sec 
      $timer.AutoReset = $true 
     $itemsPresent = $fileAndFolderList | Measure-Object 

     $action = {foreach($item in $fileAndFolderList)` 
      {` 
       if($itemsPresent -ne 0)` 
       {` 
        if($targetLocationFileAndFolderList.IndexOf($item) -ne -1)` 
        {` 
         $itemsPresent = $itemsPresent - 1` 
        }` 
        else` 
        {` 
         $itemsPresent = $fileAndFolderList | Measure-Object` 
        }` 
       }` 
       else` 
       {` 
        $timer.stop()` 
       }` 
      }` 
    } 

    Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action $action | Out-Null 

     $timer.Enabled = $true 
    } 

    Start-Job -ScriptBlock $scriptBlock -ArgumentList $currentLocation -Name "CheckingFiles" 

    Wait-Job -Name "CheckingFiles" 
    Write-Host "All files have been copied." 
} 

Я не получаю никаких ошибок, но вместо выполнения команд оно пишет для обоих стартовых работ следующее:

HasMoreData : True 
StatusMessage : 
Location  : localhost 
Command  : Write-Host "Copying files to '"C:\Program Files\Ba-insight\Longitude Fast Component"'"` 

          Copy-Item $currentLocation"\Longitude Fast Component" "C:\Program Files\Ba-insight\Longitud 
       e Fast Component" -recurs` 

JobStateInfo : Running 
Finished  : System.Threading.ManualResetEvent 
InstanceId : 70ab6414-0ca4-467e-b283-20057e4141ad 
Id   : 1 
Name   : CopyingFiles 
ChildJobs  : {Job2} 
Output  : {} 
Error   : {} 
Progress  : {} 
Verbose  : {} 
Debug   : {} 
Warning  : {} 
State   : Running 

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

Также возможно, чтобы начальная работа ожидала ввода пользователя с помощью команды read-host?

EDIT: Я нашел проблему с тем, почему работа не выполнялась. Параметр не передавался правильно. Вот ссылка, где я нашел решение.

Passing parameters to start-job

Последний пример работает, и вы должны сделать это так, что даже для одного параметра.

У меня все еще есть один вопрос. Материал, который я написал выше, по-прежнему выводится на консоль. Есть ли способ подавить нежелательный вывод из командлета start-job?

ответ

0

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

Так что вам нужно что-то подобное в ваших блоках сценариев:

$scriptBlock = { 
    param([string]$currentLocation) 

    $source - Join-Path -Path $currentLocation -ChildPath "Longitude Fast Component" 
    $destination = "C:\Program Files\Ba-insight\Longitude Fast Component" 
    Write-Host "Copying files to [$destination]" 
    Copy-Item $source $destination -recurse 
} 
+0

просто попытался его с теми же результатами. Я решил, что мне, вероятно, нужно будет добавить параметр, но я подумал, что если бы это была проблема, я бы получил ошибку с нулевым параметром. все еще не могу понять, почему он выводит команды как строки вместо их выполнения. – user1752736

+0

Просто заметив символ продолжения строки после записи-хоста, в блоке скрипта вы можете просто использовать линейные фиды с запятой для следующей команды. –

+0

Это должно сказать «linefeeds * или * semi-colon» –

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