Использование Start-Job в скрипте

Использование сценария в PowerShell для рекурсивного прохождения всех папок на нескольких устройствах NAS для отображения каждой папки с ее полным путем в файле Out-File. Используя скрипт Get-FolderEntry, я нашел здесь.

Поскольку у меня есть несколько блоков NAS с более чем 260 символами в имени файла/длине пути, я решил использовать многопоточность для ускорения процесса.

Код:

. C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1
# list with the servers
$Computers = Get-Content C:\Users\mdevogea\Desktop\servers.txt

# scriptblock calling on get-FolderEntry
$sb = {
    param ($Computer, $fname)
    C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1 -Path $Computer |
        fl | Out-File -Append -Width 1000 -FilePath $fname
}

foreach($Computer in $Computers)
{
    $name = $Computer.Replace("\", "")
    $fname = $("C:\Users\mdevogea\Desktop\" + $name + ".txt")
    #Get-FolderEntry -Path $Computer | fl | Out-File -Append -Width 1000 $fname

    $res = Start-Job $sb -ArgumentList $Computer, $fname
}

# Wait for all jobs
Get-Job
while(Get-Job -State "Running")
{
    Write-Host "Running..."
    Start-Sleep 2
}
# Get all job results
Get-Job | Receive-Job | Out-GridView

Уже:

  1. Я либо получаю пустые файлы с правильным названием файла.

  2. Я получаю правильный именованный файл с кодом Get-FolderEntry в нем.

  3. Я получаю ошибки в зависимости от того, что я передаю в блок сценария.

Короче говоря, это, наверное, глупо, но вы этого не видите.


person Michael    schedule 13.12.2016    source источник
comment
Внутри блока сценария сначала создайте скрипт Get-FolderEntry.ps1, а затем вызовите функцию Get-FolderEntry. Если это не поможет, покажите ошибки, которые вы получаете.   -  person Ansgar Wiechers    schedule 13.12.2016
comment
Я полагаю, вы имеете в виду следующее: $sb = {. Параметр C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1 ($Computer, $fname) C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1 -Path $Computer | фл | Out-File -Append -Width 1000 -FilePath $fname } если это так, то это ошибка: невозможно связать аргумент с параметром FilePath, поскольку он равен нулю. + CategoryInfo: InvalidData: (:) [Out-File], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.OutFileCommand + PSComputerName: localhost   -  person Michael    schedule 13.12.2016
comment
Оператор Param() должен быть первым. Затем точка-источник. И вы все еще используете скрипт вместо функции.   -  person Ansgar Wiechers    schedule 13.12.2016
comment
прошу прощения за это, я относительно новичок в powershell. поэтому правильный блок сценария будет следующим: $sb = {param ($Computer, $fname) . C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1 Get-FolderEntry -Path $Computer| фл | Out-File -Append -Width 1000 -FilePath $fname} если запускаю так, то работает без ошибок, но мои файлы пустые (поэтому без полных путей ко всем подкаталогам)   -  person Michael    schedule 14.12.2016


Ответы (1)


В конце концов нашел это сам после проб и ошибок:

. C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1
# list with the servers
$Computers = Get-Content C:\Users\mdevogea\Desktop\servers.txt

# scriptblock calling on get-FolderEntry
$sb = {
    Param ($Computer, $fname)
    . C:\Users\mdevogea\Downloads\Get-FolderEntry.ps1 
    (Get-FolderEntry -Path $Computer | fl | Out-File -Append -Width 1000 -FilePath $fname)
}

foreach ($Computer in $Computers)
{
    $name = $Computer.Replace("\", "")
    $fname = $("C:\Users\mdevogea\Desktop\" + $name + ".txt")
    $res = Start-Job $sb -ArgumentList $Computer, $fname
}

# Wait for all jobs
Get-Job
while (Get-Job -State "Running")
{
    Write-Host "Running..."
    Start-Sleep 2
}
# Get all job results
Get-Job | Receive-Job | Out-GridView

Большое спасибо, Ансгар, за то, что указал мне правильное направление!

person Michael    schedule 14.12.2016