PowerShell函数不会产生输出

时间:2016-12-05 17:53:22

标签: powershell

很抱歉,如果这是一个基本问题,我是PS初学者...为什么以下Powershell函数运行正常并在我将其添加到$ Profile时将输出写入控制台,但是当它没有产生任何输出时我把它作为.ps1运行? (当我作为脚本运行时,它似乎运行但不返回任何输出或错误。

我的执行政策=不受限制,我以管理员身份运行。想法?

    function Get-NetStats
    { 
        $properties = 'Protocol','LocalAddress','LocalPort' 
        $properties += 'RemoteAddress','RemotePort','State','ProcessName','PID'

        netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | ForEach-Object {

            $item = $_.line.split(" ",[System.StringSplitOptions]::RemoveEmptyEntries)

            if($item[1] -notmatch '^\[::') 
            {            
                if (($la = $item[1] -as [ipaddress]).AddressFamily -eq 'InterNetworkV6') 
                { 
                   $localAddress = $la.IPAddressToString 
                   $localPort = $item[1].split('\]:')[-1] 
                } 
                else 
                { 
                    $localAddress = $item[1].split(':')[0] 
                    $localPort = $item[1].split(':')[-1] 
                } 

                if (($ra = $item[2] -as [ipaddress]).AddressFamily -eq 'InterNetworkV6') 
                { 
                   $remoteAddress = $ra.IPAddressToString 
                   $remotePort = $item[2].split('\]:')[-1] 
                } 
                else 
                { 
                   $remoteAddress = $item[2].split(':')[0] 
                   $remotePort = $item[2].split(':')[-1] 
                } 

                New-Object PSObject -Property @{ 
                    PID = $item[-1] 
                    ProcessName = (Get-Process -Id $item[-1] -ErrorAction SilentlyContinue).Name 
                    Protocol = $item[0] 
                    LocalAddress = $localAddress 
                    LocalPort = $localPort 
                    RemoteAddress =$remoteAddress 
                    RemotePort = $remotePort 
                    State = if($item[0] -eq 'tcp') {$item[3]} else {$null} 
                } | Select-Object -Property $properties 
            } 
        } 
    }

5 个答案:

答案 0 :(得分:1)

TessellatingHeckler说得对,虽然可能不是那么清楚,也许比我更加讽刺,我已经说过了:

简单地说,你的.ps1 定义了函数Get-NetStats但它没有调用函数。如果没有调用函数,你将无法获得任何输出。

运行.ps1后 - 或者,如果函数定义在您的配置文件中 - 将定义该函数,只需输入 Get-NetStats <,即可在PowerShell会话中随时调用该函数/强>

答案 1 :(得分:0)

您确定不需要在脚本中输出返回结果吗?在PowerShell窗口中运行$ Profile中的函数时,结果将返回到该窗口。在脚本中情况并非如此。

在脚本中尝试:

$result = Get-NetStats
$result

答案 2 :(得分:0)

我找到了一个程序,帮助我解决这个问题。它位于:

In PowerShell, how do I define a function in a file and call it from the PowerShell commandline?

现在,我需要弄清楚如何将我的新功能部署到远程主机,可能是通过GPO或其他PowerShell脚本......

干杯!

答案 3 :(得分:0)

为了在运行.ps1文件时查看位于.ps1文件中的函数的输出,您需要在脚本中添加函数调用。

例如,假设我创建了以下文件:Do-AlmostNothing.ps1

# Do-AlmostNothing.ps1
# define the function doNotSoMuch
function doNotSoMuch {
   Write-Host "Look how little I've accomplished!"
}
# execute the function defined above
doNotSoMuch

如果没有调用该函数,则不会发生任何事情。

执行脚本:

PS> ./Do-AlmostNothing.ps1
Look how little I've accomplished!
PS>

答案 4 :(得分:0)

您可以尝试这样的

  

$myStaff = Get-NetStats   

  Write-output "$myStaff"