2016-12-13 2 views
0

Использование сценария в PowerShell для рекурсивного прохождения через все папки в нескольких ящиках NAS для отображения каждой папки с полным путем в Out-File. С помощью сценария Get-FolderEntry я нашел here.Использование Start-Job по сценарию

Поскольку у меня есть несколько ящиков 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. Я получаю ошибки в зависимости от того, что я передаю скриптблоку.

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

+0

Внутри скриптового блока first dot-source * script * 'Get-FolderEntry.ps1', затем вызывается функция *' Get-FolderEntry'. Если это не поможет показать ошибки, которые вы получаете. –

+0

Предполагаю, вы имеете в виду вот так: $ sb = {. C: \ Users \ mdevogea \ Downloads \ Get-FolderEntry.ps1 param ($ Computer, $ fname) C: \ Users \ mdevogea \ Downloads \ Get-FolderEntry.ps1 -Path $ Компьютер | fl | Out-File -Append -Width 1000 -FilePath $ имя_файла } если да, то это ошибка: Невозможно привязать аргумент параметра «FilePath», поскольку он является недействительным. + CategoryInfo: InvalidData: (:) [Out-File], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.OutFileCommand + PsComputerName: локальный – Michael

+0

Параметр 'Param()' оператор должен быть первым. Затем точка-источник. И вы * все еще * запускаете * скрипт * вместо * функции *. –

ответ

0

Нашел в конце концов, я после некоторых проб и ошибок:

. 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 

Спасибо большое Ansgar для указывая мой в правильном направлении!

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