与Powershell并行发出请求会导致;不能对空值表达式调用方法";

与Powershell并行发出请求会导致;不能对空值表达式调用方法";,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在尝试使用powershell并行生成webrequests。我有一个函数“MakeRequest”,它生成我需要发出的请求类型。当一次性运行或按顺序运行时,此功能工作正常。然而,当我尝试使用启动作业或定义工作流来并行执行请求时,我遇到了错误“您不能对空值表达式调用方法”。当我尝试从web请求“$response=$webRequest.GetResponse()获取响应时,会引发此错误 我做错了什么/错过了什么 [System.Net.ServicePointManager]::Serve

我正在尝试使用powershell并行生成webrequests。我有一个函数“MakeRequest”,它生成我需要发出的请求类型。当一次性运行或按顺序运行时,此功能工作正常。然而,当我尝试使用启动作业或定义工作流来并行执行请求时,我遇到了错误“您不能对空值表达式调用方法”。当我尝试从web请求“$response=$webRequest.GetResponse()获取响应时,会引发此错误

我做错了什么/错过了什么

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

$MakeRequest = {
    param($machineName, [int]$port)
    Write-Host $machineName $port
    $url = "https://$machineName" + ":$port/path"
    $webRequest = [net.WebRequest]::Create($url)
    $webRequest.Headers.Add('MyHeader', 'MyValue')
    # 10 Minute Timeout
    $webRequest.Timeout = 600000

    $returnCode = 1
    $output = ""
    Try {
        Write-Host $webRequest
        $response = $webRequest.GetResponse()
        $statusCode = [int]$response.StatusCode

        if ($statusCode -ne 200) {
            Write-Host "Server $machineName did not return a 200, and instead returned a $statusCode"
            Exit 1
        }

        [IO.Stream] $stream = $response.GetResponseStream()
        [IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
        [string] $output = $reader.readToEnd()
        $stream.flush()
        $stream.close()
        $returnCode = 0
    } Catch [system.exception] {
        [IO.Stream] $stream = $_.Exception.Response.GetResponseStream()
        [IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
        [string] $output = $reader.readToEnd()
        $stream.flush()
        $stream.close()
    } Finally {
        Write-Debug "$machineName $output"
    }
}

@("mach1, mach2, mach3" ) | ForEach-Object { Start-Job -ScriptBlock $MakeRequest -ArgumentList $_, 10443 }

Get-Job | Wait-Job

Get-Job | % { Receive-Job $_.Id; Remove-Job $_.Id }

假设您发布的代码与您正在使用的代码相同,我相信问题在于您将参数传递给scriptblock的方式。我假设您希望foreach对象执行3次(一次用于mach1,一次用于mach2,一次用于mach3)是否正确

如果这个假设是正确的,那么问题是您只是将字符串“mach1,mach2,mach3”管道传输到foreach,而不是一个由3个字符串组成的数组。循环执行一次,并将“mach1,mach2,mach3”作为第一个参数传递

我制作了一个与您的脚本类似的脚本来测试它,如果字符串按如下方式进行管道传输,它就会工作:

@(“mach1”、“mach2”、“mach3”)| Foreach对象{这里是您的起始工作代码}


请注意,每个项目现在都包含在自己的引号中。

您是否研究过使用
调用WebRequest
方法?我尝试过,但也得到了一个错误-“基础连接已关闭:发送时发生意外错误。+CategoryInfo:invalidooperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke WebRequest]、WebException+FullyQualifiedErrorId:WebCmdletWebResponseException、Microsoft.PowerShell.Commands.InvokeWebRequestCommand+PSComputerName:localhost“尝试放置
[System.Net.ServicePointManager]::ServerCertificateValidationCallback={$true}”
$MakeRequest
脚本块中。@PetSerAl-不走运。我不知道为什么这被否决了,他是绝对正确的。