PowerShell启动时出现System.Threading.Tasks.Task异常提示的问题
PowerShell配置加载前异常文本的解决方法
问题描述
加载PowerShell配置文件前,终端会显示System.Threading.Tasks.Task1[System.String]`异常文本,以下是修改后的PowerShell配置脚本,需解决该异常提示问题。
修改后的PowerShell配置脚本
### PowerShell模板配置文件 ### 版本1.03 - Tim Sneath <tim@sneath.org> ### ### 该文件应存储在$PROFILE.CurrentUserAllHosts ### 若$PROFILE.CurrentUserAllHosts不存在,可通过以下命令创建: ### PS> New-Item $PROFILE.CurrentUserAllHosts -ItemType File -Force ### 这将创建文件及其所在的子目录(若不存在) ### ### 提醒:要在Windows客户端启用本地未签名脚本执行, ### 需要从提升权限的PowerShell提示符运行以下命令(或类似命令): ### Set-ExecutionPolicy -ExecutionPolicy RemoteSigned ### 这是Windows Server 2012 R2及以上版本的默认策略。关于执行策略的更多信息,请运行Get-Help about_Execution_Policies。 # 导入Terminal Icons模块 Import-Module -Name Terminal-Icons # 检测当前用户是否拥有管理员权限 $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal $identity $isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) # 目录跳转快捷方式 function cd... { Set-Location ..\.. } function cd.... { Set-Location ..\..\.. } # 文件哈希计算函数 - 用于验证下载文件完整性 function md5 { Get-FileHash -Algorithm MD5 $args } function sha1 { Get-FileHash -Algorithm SHA1 $args } function sha256 { Get-FileHash -Algorithm SHA256 $args } # 记事本快捷启动函数 function n { notepad $args } # 驱动器快捷跳转函数 function HKLM: { Set-Location HKLM: } function HKCU: { Set-Location HKCU: } function Env: { Set-Location Env: } # 若存在Work Folders,创建对应驱动器快捷方式 if (Test-Path "$env:USERPROFILE\Work Folders") { New-PSDrive -Name Work -PSProvider FileSystem -Root "$env:USERPROFILE\Work Folders" -Description "Work Folders" function Work: { Set-Location Work: } } # 设置命令提示符和窗口标题:采用类UNIX风格,管理员权限时提示符显示#,窗口标题标注PowerShell版本及[ADMIN] function prompt { if ($isAdmin) { "[" + (Get-Location) + "] # " } else { "[" + (Get-Location) + "] $ " } } $Host.UI.RawUI.WindowTitle = "PowerShell {0}" -f $PSVersionTable.PSVersion.ToString() if ($isAdmin) { $Host.UI.RawUI.WindowTitle += " [ADMIN]" } # 实现类似dir /s /b的功能,例如dirs *.png等同于dir /s /b *.png function dirs { if ($args.Count -gt 0) { Get-ChildItem -Recurse -Include "$args" | Foreach-Object FullName } else { Get-ChildItem -Recurse | Foreach-Object FullName } } # 启动管理员权限进程的函数:带参数则以管理员权限执行指定命令,否则启动新的管理员PowerShell窗口 function admin { if ($args.Count -gt 0) { $argList = "& '" + $args + "'" Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $argList } else { Start-Process "$psHome\powershell.exe" -Verb runAs } } # 为admin命令设置类UNIX别名,支持sudo/su命令以管理员权限执行操作 Set-Alias -Name su -Value admin Set-Alias -Name sudo -Value admin # 编辑当前配置文件的快捷函数 function Edit-Profile { if ($host.Name -match "ise") { $psISE.CurrentPowerShellTab.Files.Add($profile.CurrentUserAllHosts) } else { notepad $profile.CurrentUserAllHosts } } # 删除临时变量,释放空间 Remove-Variable identity Remove-Variable principal # 检测命令是否存在的辅助函数 Function Test-CommandExists { Param ($command) $oldPreference = $ErrorActionPreference $ErrorActionPreference = 'SilentlyContinue' try { if (Get-Command $command) { return $true } } Catch { Write-Host "$command 不存在"; return $false } Finally { $ErrorActionPreference = $oldPreference } } # 设置默认编辑器别名vim if (Test-CommandExists nvim) { $EDITOR = 'nvim' } elseif (Test-CommandExists pvim) { $EDITOR = 'pvim' } elseif (Test-CommandExists vim) { $EDITOR = 'vim' } elseif (Test-CommandExists vi) { $EDITOR = 'vi' } elseif (Test-CommandExists code) { # VS Code $EDITOR = 'code' } elseif (Test-CommandExists notepad) { # 回退到系统记事本,兼容所有Windows设备 $EDITOR = 'notepad' } Set-Alias -Name vim -Value $EDITOR # 常用快捷函数 function ll { Get-ChildItem -Path $pwd -File } function g { Set-Location $HOME\Documents\Github } function Get-PubIP { (Invoke-WebRequest http://ifconfig.me/ip ).Content } function uptime { # Windows PowerShell 获取系统运行时间 Get-WmiObject win32_operatingsystem | Select-Object csname, @{ LABEL = 'LastBootUpTime'; EXPRESSION = { $_.ConverttoDateTime($_.lastbootuptime) } } } function reload-profile { & $profile } function find-file($name) { Get-ChildItem -recurse -filter "*${name}*" -ErrorAction SilentlyContinue | ForEach-Object { $place_path = $_.directory Write-Output "${place_path}\${_}" } } function unzip ($file) { Write-Output("正在解压", $file, "到", $pwd) $fullFile = Get-ChildItem -Path $pwd -Filter .\cove.zip | ForEach-Object { $_.FullName } Expand-Archive -Path $fullFile -DestinationPath $pwd } function grep($regex, $dir) { if ( $dir ) { Get-ChildItem $dir | select-string $regex return } $input | select-string $regex } function touch($file) { "" | Out-File $file -Encoding ASCII } function df { get-volume } function sed($file, $find, $replace) { (Get-Content $file).replace("$find", "$replace") | Set-Content $file } function which($name) { Get-Command $name | Select-Object -ExpandProperty Definition } function export($name, $value) { set-item -force -path "env:$name" -value $value; } function pkill($name) { Get-Process $name -ErrorAction SilentlyContinue | Stop-Process } function pgrep($name) { Get-Process $name } # 导入Chocolatey自动补全配置文件 $ChocolateyProfile = "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" if (Test-Path($ChocolateyProfile)) { Import-Module "$ChocolateyProfile" } # 初始化Starship提示符 Invoke-Expression (&starship init powershell)
异常原因及解决方法
原因分析
出现System.Threading.Tasks.Task1[System.String]的核心原因是:配置最后一行的&starship init powershell在部分PowerShell环境中返回了异步任务对象,而非直接返回字符串,Invoke-Expression`执行时会直接输出该任务的类型名称。
解决步骤
将最后一行的Starship初始化代码修改为以下两种方式之一:
方式1:强制转换为字符串
Invoke-Expression (&starship init powershell | Out-String)
方式2:等待异步任务完成后再执行
$starshipInit = &starship init powershell if ($starshipInit -is [System.Threading.Tasks.Task]) { $starshipInit = $starshipInit.GetAwaiter().GetResult() } Invoke-Expression $starshipInit
验证方法
修改配置后,执行reload-profile命令重新加载配置,或直接重启PowerShell终端,检查异常文本是否消失。
内容的提问来源于stack exchange,提问作者meyu
相关产品推荐
相关产品推荐

