我有一个以下函数,它显示一个凭据窗口,如下所示。
文件: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_Scopes
和about_Scripts
的点源部分