使用PowerShell

时间:2015-11-24 14:59:29

标签: powershell

例如,我有以下功能:

Function enable-RemoteDesktopConnections
{
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 00000000
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fSingleSessionPerUser" -Value 00000000
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 00000000
}

这只是启用远程桌面。现在,我希望在函数内部进行一些错误处理,但同样会向调用本身返回成功或失败,以便我可以在脚本中进一步更新值。

您可以将函数包装在IF Statement中,然后使用布尔值来确定它是否成功?

例如,使用此功能,$a = "3"

Function foo {
 If($a -eq "1"){
    $true
 }else{
    $false
 }}

然后我们将函数包装在IF中,即函数返回true,success或false,Fail。

If(foo){
  Write-Host "Success"
}else{
  Write-Host "Fail"
}

是否有更好的方法,更有效的方法,更强大的方法。

2 个答案:

答案 0 :(得分:4)

如果每个Set-ItemProperty来电都依赖于之前的通话,您可能希望利用transactions的强大功能:

Function Enable-RemoteDesktopConnections
{
    param()

    # Set ErrorAction preference, only applies to function scope
    $ErrorActionPreference = "SilentlyContinue"

    # Initiate a transaction that automatically rolls back on error
    Start-Transaction -RollbackPreference Error

    # Do your thing with the -UseTransaction parameter switch
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 00000000 -UseTransaction
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fSingleSessionPerUser" -Value 00000000 -UseTransaction
    Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 00000000 -UseTransaction

    # Attempt to complete transaction
    Complete-Transaction

    # return the status of whether the last call succeeded or not
    return $?
}

答案 1 :(得分:2)

由于这是一个编程风格的问题,这里有一些需要考虑的PS风格元素。通常,内置PS cmdlet不使用返回码。他们使用异常,在错误流中返回错误,或者返回$ null。

简而言之,例外允许在处理错误方面具有很大的灵活性:

  • 在您编写的函数中,可以忽略错误处理并留给调用者
  • 或者可以对整个块执行错误处理 代码
  • 或者可以针对特定的代码行执行错误处理
  • 无论如何,您都可以使用finally执行资源清理 是否发生错误
  • 您可以使用陷阱在同一位置处理给定范围内的所有错误(以及子范围)
  • 使用$ ErrorActionPreference或-ErrorAction通用参数可以将异常转换为错误或错误转换为异常

在前一个答案中讨论的事务是将多个动作转换为单个原子动作的一种方法。在事务中,要么所有单个操作都成功,要么都不成功。对于RDP的3个注册表设置,可能重要也可能不重要。我有点怀疑它。否则,设计这些注册表设置的人不会以这种方式设计它们 - 以方便用户遇到麻烦。

交易不会对信号错误有所帮助。因此,如果您担心enable-RemoteDesktopConnections的来电者知道交易是否成功,那么交易就不会直接启用。它们确保所有3个注册表操作都成功/失败,因此您的错误信号可以是二进制(是或否,异常或无异常)。与您的错误信号相反,例如:1)执行了所有注册表更新,2)执行了一些操作,一些操作失败,以及3)它们都失败了。

此外,该事务还确保注册表永远不会处于3个更改中的某些更改状态,并且由于脚本的操作,某些更改不会 - 。但是,没有什么可以阻止其他程序更改这3个值的子集。