我的 PowerShell 配置文件 (CurrentUser.AllHosts) 中有两个脚本让我抓狂,因为它们在看似相同的控制台上给出了不同的结果。 在 Powershell(提升版)上,脚本没有任何问题,但在 ConEmu(提升版)和 Powershell ISE 中,它失败并出现 Invoke-RestMethod 错误 - 请参阅下面的完整错误。

脚本是

#Checking latest version of Git 
function Show-GitCurrentRelease() { 
    [cmdletbinding()] 
    param( 
        [ValidateNotNullOrEmpty()] 
        [string]$uri = "https://api.github.com/repos/git-for-windows/git/releases/latest" 
    ) 
    Begin { 
        Write-Verbose "[BEGIN] Starting: $($MyInvocation.MyCommand)" 
    }  
 
    Process { 
        Write-Verbose "[PROCESS] Getting current release information from $uri" 
        $data = Invoke-RestMethod -Uri $uri -Method Get 
 
        if ($data.tag_name) { 
            [PSCustomObject]@{ 
                Name = $data.name 
                Version = $data.tag_name 
                Released = $($data.published_at -as [datetime]) 
            } 
        } 
    } 
 
    End { 
        Write-Verbose "[END] Ending: $($MyInvocation.MyCommand)" 
    } 
} # Close Show-GitCurrentRelease 

# Downloading latest version of Git 
function Get-GitCurrentRelease() { 
  # Download the latest 64bit version of Git for Windows 
  $uri = 'https://git-scm.com/download/win' 
  # Path to store the downloaded file 
  # In this case it's saved to the temp directory for the session 
  $path = $env:TEMP 
 
  # Get the web page 
  $page = Invoke-WebRequest -Uri $uri -UseBasicParsing 
 
  # Get the download link 
  $dl = ($page.links | where outerhtml -Match 'git-.*64-bit.exe' | select -First 1 * ).href 
 
  # Split out the file name 
  $filename = Split-Path $dl -Leaf 
 
  # Construct a file path for the download 
  $out = Join-Path -Path $path -ChildPath $filename 
 
  # Download the file 
  Invoke-WebRequest -Uri $dl -OutFile $out -UseBasicParsing 
 
  # Check it out 
  Get-Item $out 
} # Close Get-GitCurrentRelease 

在 Powershell(提升的控制台)中运行 Show-GitCurrentRelease 我得到以下结果:

Name                   Version           Released 
----                   -------           -------- 
Git for Windows 2.16.2 v2.16.2.windows.1 2018-02-20 13:32:41 

但是,如果我在配置为运行提升的 Powershell 提示符的 ConEmu 中运行相同的命令,我会得到以下信息:

Invoke-RestMethod : The request was aborted: Could not create SSL/TLS secure channel. 
At [HOME]\Documents\WindowsPowerShell\profile.ps1:63 char:17 
+         $data = Invoke-RestMethod -Uri $uri -Method Get 
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException 
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand 

我使用 Get-GitCurrentRelease 得到了类似的结果。在 PS 上,它将最新的 Git 安装程序下载到 TMP 文件夹,而我在 ConEmu 中收到 Invoke-RestMethod 错误。 我一直在谷歌搜索这个错误,据我所知,这个错误的通常原因是 powershell 和脚本正在访问的站点之间的 TLS 版本不匹配。但这在这种情况下似乎是另一回事,因为它直接在 PS 控制台中工作,而不是在 ConEmu 中工作,ConEmu 只是控制台周围的包装器/皮肤 - 在这种情况下(提升的)PS。

Powershell ISE 让我遇到同样的 Invoke-RestMethod 错误。

我测试了在 ConEmu、PS 和 PS ISE 上运行 $Host 并得到以下结果:

ConEmu 中 $host 的结果(提升):

Name             : ConsoleHost 
Version          : 5.1.16299.248 
InstanceId       : fb8e89c9-7395-47ab-b732-a102da041999 
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface 
CurrentCulture   : sv-SE 
CurrentUICulture : en-US 
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy 
DebuggerEnabled  : True 
IsRunspacePushed : False 
Runspace         : System.Management.Automation.Runspaces.LocalRunspace 

在 PowerShell 中(提升):

Name             : ConsoleHost 
Version          : 5.1.16299.248 
InstanceId       : ec79dc29-4444-4230-a0ee-a2ead575903f 
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface 
CurrentCulture   : sv-SE 
CurrentUICulture : en-US 
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy 
DebuggerEnabled  : True 
IsRunspacePushed : False 
Runspace         : System.Management.Automation.Runspaces.LocalRunspace 

最后在 PowerShell ISE(提升)中:

Name             : Windows PowerShell ISE Host 
Version          : 5.1.16299.248 
InstanceId       : 7180cdbf-50ee-4187-8fc0-ac0b230095fa 
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface 
CurrentCulture   : sv-SE 
CurrentUICulture : en-US 
PrivateData      : Microsoft.PowerShell.Host.ISE.ISEOptions 
DebuggerEnabled  : True 
IsRunspacePushed : False 
Runspace         : System.Management.Automation.Runspaces.LocalRunspace 

ConEmu 和 PS 除了(预期的)InstanceId 和 PS ISE 具有不同的 PrivateData 值(并非意外)之外是相同的。

如果我能看到不同控制台之间的任何有意义的差异,那就更容易了

请您参考如下方法:

错误:

Invoke-RestMethod:请求已中止:无法创建 SSL/TLS 安全通道

发生这种情况是因为默认情况下,当您请求的站点使用更高版本时,PowerShell 使用 TSL 1.0。

要将脚本设置为使用更高版本,请在调用 Invoke-RestMethod 之前尝试此操作:

$AllProtocols = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12' [Net.ServicePointManager]::SecurityProtocol = $AllProtocols


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!