为什么从 Powershell 控制台执行 cmdlet 时不显示 GUI,但在作为脚本运行时显示



我有一个以下函数,它显示一个凭据窗口,如下所示。

文件:popup.ps1(这不是 psm。只是一个只有popup()的脚本(

function popup
{
    [CmdletBinding()]
    param(
        [Parameter (Mandatory=$True)]
        [string] $username
    )
    $credential = Get-Credential -Username $username -Message "Provide Credentials"
    $pass = $credential.GetNetworkCredential().password
}

现在,如果此 ps1 来自 PowerShell 控制台并执行popup()命令,则不会显示凭据弹出窗口。但是,如果我通过调用脚本包装此函数并执行(即右键单击→使用 PowerShell 运行(,我能够看到 GUI 弹出窗口。

文件: wrapper.ps1

. "./popup.ps1"
$uname = "viswa-ksp"
popup -username $uname

谁能解释为什么从PowerShell控制台运行时不显示GUI,但是作为脚本执行时?我在这里错过了什么吗?

编辑:

实际上是我这边的一个错误。开发人员同事. <path to the cmdlet source>评论了采购部分,作为他针对不同问题的调试/故障排除的一部分,我已经监督了它。然而,在心理上认为采购仍然存在(因为我知道我已经包括了采购(。

感谢您的宝贵意见。由于超过2个人说不可复制,我再次去看剧本,发现了这个问题。

但这是后续问题。我知道对于 cmdlet,您必须获取它。但我想了解,如果您只是运行 cmdlet 而不获取它,为什么什么都不会发生。没有错误 没有弹出窗口。我什至测试了返回代码。它是空的。

PS C:UserskspviswaDesktop> .popup.ps1
PS C:UserskspviswaDesktop> $ret = .popup.ps1
PS C:UserskspviswaDesktop> Write-Host $ret
PS C:UserskspviswaDesktop>

有人会解释这种行为吗?

在没有点源的情况下运行脚本后没有返回任何内容的原因是,脚本没有抛出任何输出。将其另存为脚本并在没有点源的情况下运行

function popup
{
[CmdletBinding()]
param(
    [Parameter (Mandatory=$True)]
    [string] $username
)
write-host "String Inside function"
$credential = Get-Credential -Username $username -Message "Provide   Credentials"
$credential.GetNetworkCredential().password
}
write-host "String outside Function but inside the script"

输出必须是函数外部但在脚本
内部的字符串通过点源尝试

PS >. .script.ps1
PS >String outside Function but inside the script
PS >popup -username USERNAME
PS >String Inside function

如果你不对脚本进行点源,那么在脚本执行后,函数将被定义和删除,因为函数的作用域默认在脚本内

如果你点源,它会将函数加载到内存中。

如果将函数的范围更改为全局,则可以在没有点源的情况下使用它

function global: popup
{
[CmdletBinding()]
param(
    [Parameter (Mandatory=$True)]
    [string] $username
)
write-host "String Inside function"
$credential = Get-Credential -Username $username -Message "Provide   Credentials"
$credential.GetNetworkCredential().password
}
write-host "String outside Function but inside the script"

您可以在没有点源的情况下运行脚本打开一个新的PowerShell控制台并尝试这个

PS >.script.ps1
PS >String outside Function but inside the script
PS >popup -username USERNAME
PS >String Inside function

有关示波器 https://technet.microsoft.com/en-us/library/hh847849.aspx 的更多信息

此致敬意

克夫普拉松

您的函数不会返回密码,因为您将密码分配给变量而不是实际返回它。更改此行:

$pass = $credential.GetNetworkCredential().password

进入这个:

$credential.GetNetworkCredential().password

此外,运行脚本不会自动调用其中定义的任何函数。函数定义只是使函数在执行脚本的作用域中可用。点源在当前范围内加载脚本,因此您可以在对脚本进行点源后在控制台中使用该函数。如果运行脚本,则会在子作用域中执行该脚本,因此需要在子作用域中显式调用该函数以调用其功能。请参阅about_Scopesabout_Scripts的点源部分

最新更新