我试图理解为什么我的某些代码不起作用。 (对于程序而言)的想法是让我使用当前用户进行操作,除非该用户单击按钮来更改他们用于提交操作的信用。我可以用另一种方式给这只猫上皮,但我很好奇为什么一段代码似乎有两种不同的结果。这是(请注意,所有写主机条目都是我试图跟踪流程):
try{
$current_credentials = Get-Credential -Credential "ACME.COM\"
write-host $current_credentials.gettype()
}
catch{
$current_Credentials = $Env:Username
write-host "catch"
}
finally{
write-host $current_credentials.gettype()
if($current_Credentials.Gettype().name -eq "PSCredential"){
$Label_Credentials_Data.Text = $current_Credentials.username
write-host "PSCred"
}
elseif($current_Credentials.Gettype().name -eq "String"){
$Label_Credentials_Data.Text = $current_Credentials
write-host "elseif"
}
else{
$Label_Credentials_Data.Text = "ERROR!"
}
$Label_Credentials_Data.refresh()
}
现在注意几点:$ current_Credentials首先初始化为$ env:username。对象$ Label_Credentials_Data是System.Windows.Forms.Label对象类型。
为了测试这个,我启动了另一个Powershell终端,以通常的方式初始化了$ current_credentials,并创建了一个ps对象,其属性为'text',方法为'refresh'(只是代码将按原样运行)。
如果我在其脚本中运行上面的代码,标签文本将变为“System.Management.Automation.PSCredential”,但如果我通过在新的终端窗口中复制和粘贴来运行它,我会正确获取$ current_credentials.username值。脚本中的gettype返回System.String两次,但在另一个终端中,我得到System.Management.Automation.PSCredential两次。
我无法理解我在这里做错了什么。我甚至将复制的代码包装成一个函数,看看它是否相关。
脚本:
System.String
System.String
elseif
复制并粘贴:
System.Management.Automation.PSCredential
System.Management.Automation.PSCredential
PSCred
编辑:对于未来的读者 - 这里有一些代码在评论中被引用。检查数据的编辑历史记录。
答案 0 :(得分:1)
也许不是答案,但对评论来说太过分了。我最好的猜测是你有一些范围问题。听起来它是以某种方式获取System.String对象类型,当您将对象设置为$ env:username时该对象类型。这是我的建议:
不是我推荐的,但实际上你可以把它变成一个字符串。用户名,作为属性,作为System.String类型。您可以将Get-Credentials命令传递给| Select -ExpandProperty UserName
,这将导致$current_credentials
仍为字符串。问题是,如果您想要实际使用用户刚刚指定的那些凭据,您已经放弃了实际的PSCredential对象而不是仅保留UserName字符串,那么您必须让它们稍后再次输入凭据。
我建议使用另一个变量作为凭据,然后将UserName属性传递给$ current_credentials。类似的东西:
try{
$tmpCreds = Get-Credential -Credential "ACME.COM\"
$current_credentials = $tmpCreds.UserName
}
catch{
$current_Credentials = $Env:Username
}
finally{
$Label_Credentials_Data.Text = $current_Credentials
$Label_Credentials_Data.refresh()
}