Возврат данных вызывающей функции из invoke-команды с параметрами - PullRequest
0 голосов
/ 16 октября 2019

Приносим извинения за длину.
Попытка изменить скрипт, который в настоящее время использует robocopy, чтобы сообщить размер пути к папке, количество дочерних папок и размер. Этот сценарий в настоящее время занимает около 24 часов, так как он идет один за другим в каждую папку. Я пытаюсь реализовать команду invoke-set для настройки заданий, чтобы она выполняла не менее 10 экземпляров robocopy в надежде, если резко сократит время выполнения. установить параметры, вызвать функцию и получить результаты без успеха. с текущим кодом (ниже), получающим ошибку;

Invoke-Command: набор параметров не может быть разрешен с использованием указанных именованных параметров. ОШИБКА: + Invoke-Command -ScriptBlock {param ($ item, $ Filter, $ params) $ ...
ОШИБКА: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ОШИБКА: + CategoryInfo: InvalidArgument: (:) [Invoke-Command], ParameterBindingException
ОШИБКА: + FullyQualifiedErrorId: AmbiguousParameterSet, Microsoft.PowerShell.Commands.InvokeCommandCommand

    Function ListFolder ($Folder, $FilterSet, $Roboparam)
    {
        write-host $Folder
        Try
        {
            $Folder = (Resolve-Path -LiteralPath $Folder -ErrorAction Stop).ProviderPath
            If (-Not (Test-Path -LiteralPath $Folder -Type Container -ErrorAction Stop))
            {Write-Warning ("{0} is not a directory and will be skipped" -f $Folder)
                Return
            }

            $Script = robocopy $Folder NULL $FilterSet $FRoboparam
            $exit_code = $LASTEXITCODE

            16, 8, 4, 2, 1 | % {
                Switch ($exit_code -band $_)
                {
                    16  { $exit_reason = "Usage error or insufficient access privileges" }
                    8   { $exit_reason = "Retry limit exceeded" }
                    4   { $exit_reason = "Some Mismatched files or directories were detected" }
                    2   { $exit_reason = "Some Extra files or directories were detected. No files were copied" }
                    1   { $exit_reason = " " }
                }
            }
            If ($exit_code -eq 0)
            {$exit_reason = 'No Change'}

            If ($Script[-6] -match $dirPattern)
            {$Dir = $matches.Dir}
            Else
            {$Dir = 0}

            If ($Script[-5] -match $countPattern)
            {$Count = $matches.Count}
            Else
            {$Count = 0}

            If ($Count -gt 0)
            {If ($Script[-4] -match $sizePattern)
                {$FSize = $matches.Size}}
            Else
            {$FSize = 0}

            $Script:TotSize += $FSize
            $Script:Report += New-Object PSObject -Property @{
                'Folder Name' = $Folder
                Files         = "{0:N0}" -f [int]$Count
                Folders       = "{0:N0}" -f [int]$Dir
                Size          = "{0:N0}" -f [long]$FSize
                Comment       = $exit_reason}

            Clear-Variable -Name Dir
            Clear-Variable -Name Count
            Clear-Variable -Name FSize
            If ($exit_reason) { Clear-Variable -Name exit_reason }}
        Catch
        {$Script:Report += New-Object PSObject -Property @{
                'Folder Name' = $Folder
                Files         = "{0:N0}" -f [int]$Count
                Folders       = "{0:N0}" -f [int]$Dir
                Size          = [long]$FSize
                Comment       = [string]$_.Exception.Message}
            Continue
        }

        Return #$Script
    }
    }

$params = New-Object System.Collections.Arraylist
$params.AddRange(@("/L","/S","/NJH","/BYTES","/FP","/NFL","/NC","/NDL","/TS","/XJ","/R:0","/W:0"))
$dirPattern = "^\s{4}Dirs\s:\s+(?<Dir>\d+).*"
$countPattern = "^\s{3}Files\s:\s+(?<Count>\d+).*"
$sizePattern = "^\s{3}Bytes\s:\s+(?<Size>\d+(?:\.?\d+)).*"

If ($PSBoundParameters['Force']) {$FileDate = 10}

If ($FileDate -lt 6){Exit}
Else
{$Paths = Get-Content $InputFile
    ForEach ($item in $Paths)
    {
        $MaxThreads = 10
        While (@(Get-Job | where { $_.State -eq "Running" }).Count -ge $MaxThreads)
            {
            Write-Host "Waiting for open thread...($MaxThreads Maximum)"
            Start-Sleep -Seconds 3
            }
        Invoke-Command -Computer . -ScriptBlock { param ($item,$Filter,$params) ${function:ListFolder} } -ArgumentList $item, $Filter, $params -AsJob
    }
}

Когда все сказано и сделано, у меня есть коллекция $ Report toпоказать имя папки, количество файлов, количество папок, размер в байтах и ​​комментарии, чтобы показать любые ошибки в Excel

$Report | Sort-Object {[long]$_.Size} -descending | Select 'Folder Name', Files, Folders, Size, Comment | Export-Csv -Path $ReportPath\$(Get-Date -uformat "%Y_%m_%d")-FileSizes.csv -Encoding ascii -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...