我有一个以下功能,它显示一个凭证窗口,如下所示。
文件: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:\Users\kspviswa\Desktop> .\popup.ps1
PS C:\Users\kspviswa\Desktop> $ret = .\popup.ps1
PS C:\Users\kspviswa\Desktop> Write-Host $ret
PS C:\Users\kspviswa\Desktop>
有人会解释这种行为吗?
答案 0 :(得分:1)
您的功能没有返回密码,因为您将密码分配给变量而不是实际returning。改变这一行:
$pass = $credential.GetNetworkCredential().password
进入这个:
$credential.GetNetworkCredential().password
此外,运行脚本不会自动调用其中定义的任何函数。函数定义只是使函数在执行脚本的范围内可用。 Dot-sourcing在当前范围内加载脚本,因此您可以在对脚本进行点源之后在控制台中使用该功能。如果运行脚本,则它在子范围内执行,因此您需要显式调用子范围中的函数来调用其功能。请参阅about_Scopes
和about_Scripts
答案 1 :(得分:1)
没有dot-sourcing运行脚本后没有返回的原因是,脚本没有抛出任何输出。 将其保存为脚本并在没有点源的情况下运行
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
如果您不点源脚本,则在脚本执行后将定义并删除该函数,因为默认情况下函数的作用域位于脚本内
如果你是dot-source,它会将函数加载到内存中。
如果您将函数的范围更改为全局,则可以在不使用dot-sourcing的情况下使用它
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
致以最诚挚的问候,
kvprasoon