Powershell foreach in function永远不会完成任务

时间:2017-09-19 08:29:27

标签: powershell

我有一个包含大约1200个计算机名称的CSV文件,并使用[system.net.dns]::resolve()查看哪些是在线的,哪些是离线的。

这很好用,但随着脚本变大,我不得不将它包装在一个函数中,但是现在它只读取文件的前8行,然后停止。

这是$y的例子:

HB4440
SVSIG09
HB2645
HB5567
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Set-PSDebug -Strict

#Function Assembling

Function Saveat ()
{
    #work in progress
    $Saveat = New-Object -Typename System.Windows.Forms.SaveFileDialog
    $Saveat.filter = "CSV (*.csv)| *.csv"
    [void]$Saveat.ShowDialog()
    return $Saveat.FileName
}

function Compare ($location)
{
    ...
}


function whichcsv()
{
    #working so far
    $location = New-Object System.Windows.Forms.OpenFileDialog
    $location.filter = "CSV (*.csv)| *.csv"
    [void]$location.ShowDialog()
    return $location.FileName
}

function Checktrough ($y , $Filter,$Saveworking,$SaveFailed)
{
    Write-Host "Function Start"
    foreach($n in $y)
    {
        try {
            $Computer = [system.net.dns]::resolve($n.$Filter) | Select HostName,AddressList 
            $IP = ($Computer.AddressList).IPAddressToString
            Write-Host $n.$Filter $IP
            New-Object PSObject -Property @{IPAddress=$IP; Name=$n.$Filter} | Export-Csv $Saveworking -NoTypeInformation -Append
        } catch {
            Write-Host "$($n.$Filter) is unreachable."
            New-Object PSObject -Property @{Name=$n.$Filter} | Export-Csv $SaveFailed -NoTypeInformation -Append
        }
    }
    Write-Host "Function end"
}

    #Select which option Form
    #region Initiate Form
    ...
    #endregion
    #Formclosed
    ...
        #Select path of the CSV
        $csvpath = whichcsv

        #Choosed Options
        $x = $listBox.SelectedItem
        switch ($x)
        {
            #Option 1 
            "AS400 Computer"
            {
                ...
            }

            #Option 2
            "AS400 Personalstamm" 
            {
               ...
            }

            #Option 3
            "ADComputer" 
            {
                #work in progress
                $CSV = Import-Csv -Path $csvpath -Delimiter ',' 
                $y = $CSV | Select Name
                $Filter = "Name"
                $Saveworking = Saveat
                $SaveFailed = Saveat
                Checktrough ($y , $Filter,$Saveworking,$SaveFailed)
            }

            #Option 4
            "ADBenutzer" 
            {
                ...
            }  
        }
    } 

1 个答案:

答案 0 :(得分:2)

您打电话给`Checkthrough'只填充第一个参数,因为您在告诉PowerShell创建数组的参数之间使用逗号。经验法则:自定义函数的行为类似于cmdlet,因此将它们称为cmdlet。

让我演示一下类似的功能:

function Foo($a,$b,$c)
{
    Write-Host "a = '$a'"
    Write-Host "b = '$b'"
    Write-Host "c = '$c'"
}

$myArray = @("X","Y","Z")

Write-Host "*** First call (OK)"
Foo $myArray "Hello" "World"

Write-Host "*** Second call (OK)"
Foo -a $myArray -c "World" -b "Hello"

Write-Host "*** Third call (Oops)"
Foo ($myArray,"Hello","World")

Write-Host "*** Same withouf braces"
Foo $myArray,"Hello","World"
相关问题