Powershell函数意外地不返回任何对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell函数意外地不返回任何对象相关的知识,希望对你有一定的参考价值。
我希望在.ps1文件中有一些代码可以创建可以在其他.ps1脚本中使用的PSSession(以避免代码重复)。
起初我以为我需要一个创建PSSession并返回它的函数,但我对它们的函数输出如何工作感到困惑。
这是我的功能:
function newRemoteSession
{
param([string]$ipAddress)
$accountName = 'admin'
$accountPassword = 'admin'
$accountPasswordSecure = ConvertTo-SecureString $accountPassword -AsPlainText -Force
$accountCredential = New-Object System.Management.Automation.PSCredential ($accountName, $accountPasswordSecure)
Try
{
$remoteSession = New-PSSession -ComputerName $ipAddress -UseSSL -Credential $accountCredential -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck) -ErrorAction Stop
}
Catch [System.Management.Automation.RuntimeException] #PSRemotingTransportException
{
Write-Host 'Could not connect with default credentials. Please enter credentials...'
$remoteSession = New-PSSession -ComputerName $ipAddress -UseSSL -Credential (Get-Credential) -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck) -ErrorAction Stop
Break
}
return $remoteSession
}
但是,当我打电话给$s = newRemoteSession(192.168.1.10)
时,$s
是空的。
当我运行脚本时
Write-Host '00'
$s = newRemoteSession('192.168.1.10')
$s
Write-Host '02'
function newRemoteSession
{
........
Write-Host '01'
$remoteSession
}
我在控制台中只得到'00',但我知道该函数运行是因为我得到了凭证提示。
编辑:
好的,现在它有效:
- Catch的中断正在阻止一切。
- 函数调用必须不带括号。
- 第二个代码是错误的,因为必须在调用之前定义函数。
答案
你自己发现了问题,但由于它们是常见的陷阱,请让我详细说明一下:
- 只在循环(
break
,continue
,for
,foreach
)或while
声明的分支处理程序中使用do
/switch
。 否则,PowerShell会查找一个封闭循环的调用堆栈,如果没有,则退出脚本。 这就是你的break
街区的catch
所发生的事情。 - 不要使用
(...)
来包含函数(命令)参数列表,也不要使用,
分隔参数: 在PowerShell中,函数 - 就像cmdlet一样 - 使用类似shell的语法调用,没有括号和空格分隔的参数(,
仅用于构造要作为单个参数传递的数组)[1]。# WRONG: method-invocation syntax does NOT apply to *functions* # (It *happens* to work *in this case*, however, because only a # a *single* argument is passed and the (...) is a no-op in this case, # but this syntax should never be used.) newRemoteSession('192.168.1.10') # OK: Shell-like syntax, which PowerShell calls *argument mode*: # Note that the argument needn't be quoted, because it # contains no shell metacharacters. # If there were additional arguments, you'd separate them with *whitespace* newRemoteSession 192.168.1.10 # BETTER: You can even use *parameter names* (again, as with cmdlets), # which helps readability. newRemoteSession -ipAddress 192.168.1.10
- 在PowerShell中,必须先定义函数,然后才能调用它们。
你最初没有注意到,因为你的
newRemoteSession
函数的先前定义恰好存在。
[1]有关PowerShell的两种基本解析模式的更多信息 - 参数模式和表达模式 - 请参阅我的this answer。
以上是关于Powershell函数意外地不返回任何对象的主要内容,如果未能解决你的问题,请参考以下文章
PowerShell WebRequest:发送时发生意外错误