尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PowerShell自动化部署VC++运行库:从原理到企业级实践

PowerShell自动化部署VC++运行库:从原理到企业级实践 1. 项目概述为什么我们需要自动化VC运行库如果你是一名Windows平台的开发者、运维工程师或者仅仅是喜欢折腾电脑的“老鸟”那么“Visual C运行库”这几个字对你来说一定不陌生。它就像空气一样平时感觉不到一旦缺失各种软件和游戏就会立刻“窒息”——弹窗报错、无法启动提示你缺少msvcp140.dll、vcruntime140.dll等文件。手动去微软官网一个个下载、安装不仅繁琐而且版本、架构x86/x64的选择也容易出错。更别提在批量部署、系统封装、或者为最终用户制作一键安装包时手动操作简直就是一场噩梦。这个项目要解决的正是这个“空气”的自动化供给问题。它的核心目标很简单告别手动安装实现Visual C运行库的自动检测、下载、静默安装与版本管理。这不仅仅是写个脚本那么简单它涉及到对微软官方分发策略的理解、对系统环境的精准判断、对静默安装参数的掌握以及一套健壮的错误处理机制。无论是为个人电脑打造一个“运行库修复工具”还是为企业环境构建一个标准化的软件部署流程这个自动化方案都能显著提升效率减少人为错误。接下来我将结合自己多年的开发和运维经验拆解如何从零构建一个可靠、高效的VC运行库自动化解决方案。我们会从原理讲起一步步深入到代码实现和避坑指南。2. 核心需求与方案设计解析2.1 需求拆解我们到底要自动化什么在动手之前必须把需求理清楚。一个完整的VC运行库自动化方案需要覆盖以下几个核心环节环境检测目标系统上已经安装了哪些版本的VC运行库是x86还是x64版本号具体是多少这决定了我们需要补装什么。版本清单管理我们需要维护一个“必备运行库清单”。这个清单不是固定的它可能包括从VC 2005到2022的所有常见版本也可能根据你的软件依赖进行裁剪例如只包含2015-2022。资源获取从哪里获取官方的、可信的安装包是每次都从微软官网下载还是本地维护一个安装包仓库静默安装如何在不弹出任何用户界面、不需要用户交互的情况下完成安装不同的版本如2005和2015-2022静默参数是否一致架构处理在64位系统上通常需要同时安装x86和x64版本因为很多32位程序依赖x86的运行库。如何优雅地处理这种“双架构”需求错误处理与日志安装失败怎么办网络下载中断怎么办如何记录详细的操作日志方便事后排查幂等性脚本或工具应该可以安全地重复执行。重复安装已存在的版本不应导致错误而应优雅跳过。2.2 方案选型脚本化是王道对于此类系统级、批量的部署任务脚本语言是最高效的选择。我们主要考虑以下几种PowerShell这是Windows平台的原生“瑞士军刀”拥有强大的系统管理能力可以方便地调用.NET框架、查询注册表、管理系统进程。对于需要深度集成Windows功能的场景它是首选。批处理Batch虽然古老但在调用命令行程序、处理简单逻辑时依然轻便快捷。可以作为复杂脚本的补充或启动器。Python跨平台能力强拥有丰富的第三方库如requests用于下载winreg用于操作注册表。如果你希望工具能在非Windows环境如开发机上生成部署包Python是个好选择。我的选择与理由我将以PowerShell作为核心实现语言。原因如下原生支持Windows 7 SP1及以上系统都内置了PowerShell无需额外部署运行环境。信息获取能力强通过Get-ItemProperty等命令可以轻松查询注册表中已安装的程序列表精准判断VC运行库的安装状态。网络操作方便Invoke-WebRequest或System.Net.WebClient可以稳定地下载文件。进程控制灵活可以方便地启动安装进程并等待其结束同时捕获输出和错误流。整个方案的架构思路是一个主控的PowerShell脚本它负责协调“检测 - 对比清单 - 下载 - 安装”的全流程。安装包我们优先尝试从微软官方CDN下载并做好本地缓存。3. 关键技术点实现与实操3.1 如何准确检测已安装的VC运行库VC运行库在系统中通常以“Microsoft Visual C 20XX Redistributable”的形式出现在“添加或删除程序”列表里。在代码层面我们通过查询Windows注册表来获取这些信息。注意64位系统下32位x86程序和64位x64程序的安装信息存放在注册表的不同位置。必须同时检查这两处。以下是检测函数的核心代码function Get-InstalledVCRedists { $installedList () # 定义需要查询的注册表路径 $registryPaths ( HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* # 64位系统上的32位程序 ) foreach ($path in $registryPaths) { $entries Get-ItemProperty -Path $path -ErrorAction SilentlyContinue foreach ($entry in $entries) { # 通过DisplayName匹配VC运行库 if ($entry.DisplayName -match Microsoft Visual C\\ [0-9]{4}.*Redistributable) { $item New-Object PSObject -Property { Name $entry.DisplayName Version $entry.DisplayVersion # 尝试从名称中推断架构例如包含“(x64)”或“64-bit” Architecture if ($entry.DisplayName -match x64|64-bit) { x64 } elseif ($entry.DisplayName -match x86|32-bit) { x86 } else { Unknown } InstallDate $entry.InstallDate } $installedList $item } } } return $installedList }实操心得匹配规则-match Microsoft Visual C\\ [0-9]{4}.*Redistributable是关键。它匹配从2005到2022的所有年份。注意\需要转义。有些旧版本如2005的DisplayName可能不包含架构信息这时Architecture字段可能为Unknown需要结合其他逻辑判断。这个函数返回的是一个对象数组方便后续用Where-Object进行过滤和比较。3.2 构建与维护“必备运行库清单”我们需要一个清单来定义“哪些运行库是必须安装的”。这个清单应该包含每个必要版本的名称关键词、下载链接和静默安装参数。一个推荐的基础清单涵盖2005-2022可以这样定义$VCRedistList ( { Year 2005; Version 8.0.50727.6195; # 注意微软已不再官方提供2005 SP1的直接下载此链接可能失效建议本地留存安装包。 # 这里仅作示例实际使用应确保链接有效或使用本地文件。 UrlX86 http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC35-3A05B0C6B8B2/vcredist_x86.exe; UrlX64 http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC35-3A05B0C6B8B2/vcredist_x64.exe; QuietArgs /q }, { Year 2008; Version 9.0.30729.5677; UrlX86 https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe; UrlX64 https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe; QuietArgs /q }, { Year 2010; Version 10.0.40219.325; UrlX86 https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe; UrlX64 https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe; QuietArgs /q /norestart }, { Year 2012; Version 11.0.61030.0; UrlX86 https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe; UrlX64 https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe; QuietArgs /install /quiet /norestart }, { Year 2013; Version 12.0.40664.0; UrlX86 https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe; UrlX64 https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe; QuietArgs /install /quiet /norestart }, # 注意2015、2017、2019、2022 共享相同的运行时v14通常安装最新的即可。 { Year 2015-2022; Version 14.0.0; # 这是一个逻辑版本号实际安装时会获取最新版 UrlX86 https://aka.ms/vs/17/release/vc_redist.x86.exe; UrlX64 https://aka.ms/vs/17/release/vc_redist.x64.exe; UrlARM64 https://aka.ms/vs/17/release/vc_redist.arm64.exe; QuietArgs /install /quiet /norestart } )重要提示版本合并从Visual Studio 2015开始VC 14.0微软采用了“共享运行时”模型。2015、2017、2019、2022的运行时是二进制兼容的。这意味着你只需要安装最新的“Microsoft Visual C 2015-2022 Redistributable”即可满足所有这些版本编译的程序。因此在清单中我将它们合并为一项“2015-2022”。链接稳定性微软的aka.ms短链接是相对稳定的指向最新版本。对于旧版本直接下载链接可能会随时间失效。在生产环境中强烈建议将必要的安装包下载到本地网络或脚本同级目录而不是每次都从网上下载。静默参数不同版本的安装程序vcredist_*.exe支持的静默安装参数可能略有不同。上述参数是经过测试的常见有效参数。/q代表完全静默/install /quiet也是常见组合/norestart防止安装后自动重启。3.3 实现静默安装与进程等待下载到安装包后下一步是执行静默安装。这里的关键是使用Start-Process命令并正确传递参数和等待。function Install-VCRedist { param( [string]$InstallerPath, [string]$QuietArgs, [string]$PackageName ) Write-Host 正在安装 $PackageName ... -ForegroundColor Cyan try { $process Start-Process -FilePath $InstallerPath -ArgumentList $QuietArgs -Wait -NoNewWindow -PassThru if ($process.ExitCode -eq 0) { Write-Host $PackageName 安装成功。 -ForegroundColor Green return $true } elseif ($process.ExitCode -eq 1638) { # 1638 是“已安装此产品的更高版本”的常见代码 Write-Host $PackageName 已存在更高版本跳过。 -ForegroundColor Yellow return $true } else { Write-Host $PackageName 安装失败退出代码: $($process.ExitCode) -ForegroundColor Red return $false } } catch { Write-Host 安装过程中发生异常: $_ -ForegroundColor Red return $false } }参数解析-Wait让PowerShell脚本等待安装程序结束然后再继续执行下一行代码。这是必须的否则脚本会瞬间启动所有安装进程导致系统混乱。-NoNewWindow在控制台当前窗口运行不弹出新窗口保持输出整洁。-PassThru返回一个进程对象这样我们才能获取到ExitCode。退出代码处理ExitCode为0通常表示成功。1638是一个特别重要的代码它表示“已安装此产品的更高版本”。遇到这个代码我们应该视为成功并跳过而不是失败。3.4 主流程逻辑整合现在我们将检测、对比、下载、安装的流程串联起来。主函数逻辑如下function Start-VCRedistAutoInstall { param( [string]$DownloadCacheDir .\VCRedistCache, [switch]$ForceDownload $false ) # 1. 创建缓存目录 if (-not (Test-Path $DownloadCacheDir)) { New-Item -ItemType Directory -Path $DownloadCacheDir -Force | Out-Null } # 2. 获取已安装列表 $installed Get-InstalledVCRedists Write-Host 当前系统已安装以下VC运行库 -ForegroundColor Magenta $installed | Format-Table Name, Version, Architecture -AutoSize # 3. 遍历必备清单 foreach ($redist in $VCRedistList) { $year $redist.Year # 对于2015-2022我们检查是否安装了任何名称包含“Microsoft Visual C 20”且年份2015的运行库 # 对于其他年份检查精确匹配 $isInstalled $false if ($year -eq 2015-2022) { $isInstalled $installed | Where-Object { $_.Name -match Microsoft Visual C\\ 20(15|17|19|22) } | Measure-Object | Select-Object -ExpandProperty Count -gt 0 } else { $isInstalled $installed | Where-Object { $_.Name -match $year } | Measure-Object | Select-Object -ExpandProperty Count -gt 0 } if ($isInstalled) { Write-Host [跳过] $year 运行库已安装。 -ForegroundColor Gray continue } Write-Host [开始处理] $year 运行库 -ForegroundColor Yellow # 4. 确定系统架构并下载对应安装包 $is64bit [Environment]::Is64BitOperatingSystem $url $null $installerName if ($is64bit) { # 64位系统通常需要安装x64和x86两个版本 $archs (x64, x86) } else { # 32位系统只安装x86 $archs (x86) } foreach ($arch in $archs) { $urlProperty Url$($arch.ToUpper()) if ($redist.ContainsKey($urlProperty)) { $url $redist[$urlProperty] $installerName vc_redist_${year}_${arch}.exe $localPath Join-Path $DownloadCacheDir $installerName # 5. 下载如果缓存中没有或强制下载 if ($ForceDownload -or -not (Test-Path $localPath)) { Write-Host 正在下载 $arch 版本... -ForegroundColor DarkCyan try { Invoke-WebRequest -Uri $url -OutFile $localPath -UseBasicParsing Write-Host 下载完成。 -ForegroundColor DarkGreen } catch { Write-Host 下载失败: $_ -ForegroundColor Red continue # 跳过这个架构的安装 } } else { Write-Host 使用缓存文件: $localPath -ForegroundColor DarkGray } # 6. 静默安装 $packageDisplayName Microsoft Visual C $year Redistributable ($arch) Install-VCRedist -InstallerPath $localPath -QuietArgs $redist.QuietArgs -PackageName $packageDisplayName } } } Write-Host n所有必备VC运行库处理完成。 -ForegroundColor Green }流程说明创建缓存避免重复下载加快后续执行速度。检测现状列出已安装的运行库让用户心中有数。遍历清单对清单中的每一个必需项进行检查。架构判断64位系统需要处理x86和x64两个架构。智能下载检查本地缓存如果文件已存在且未强制要求下载则跳过下载步骤。调用安装对每个需要安装的架构包调用静默安装函数。最后你只需要在脚本末尾调用这个主函数即可# 以管理员身份运行此脚本 # 如果需要强制重新下载加上 -ForceDownload 参数 Start-VCRedistAutoInstall -DownloadCacheDir C:\Temp\VCRedist4. 进阶优化与生产级考量基础的自动化脚本已经完成但要用于生产环境或分发给最终用户还需要考虑更多。4.1 权限提升与自我提权VC运行库的安装需要管理员权限。我们可以让脚本在启动时自动检查并请求提权。# 检查当前是否以管理员身份运行 $currentPrincipal New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host 请求管理员权限... -ForegroundColor Yellow # 重新以管理员身份启动当前脚本 $scriptPath $MyInvocation.MyCommand.Definition $argsList -File $scriptPath Start-Process PowerShell -Verb RunAs -ArgumentList $argsList exit } Write-Host 当前已具备管理员权限继续执行。 -ForegroundColor Green将这段代码放在脚本最开头。当普通用户运行时它会弹出UAC对话框用户确认后脚本会以管理员身份重新启动自身。4.2 完善的日志记录对于自动化任务详细的日志是排查问题的生命线。我们不能只把信息输出到控制台。$logDir .\Logs $logFile Join-Path $logDir VCRedist_Install_$(Get-Date -Format yyyyMMdd_HHmmss).log if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null } function Write-Log { param([string]$Message, [string]$Level INFO) $timestamp Get-Date -Format yyyy-MM-dd HH:mm:ss $logMessage $timestamp [$Level] $Message Add-Content -Path $logFile -Value $logMessage # 同时也在控制台显示但错误级别用不同颜色 switch ($Level) { ERROR { Write-Host $logMessage -ForegroundColor Red } WARN { Write-Host $logMessage -ForegroundColor Yellow } INFO { Write-Host $logMessage -ForegroundColor White } default { Write-Host $logMessage } } }然后在脚本的关键步骤开始、结束、下载、安装、出错调用Write-Log函数。例如Write-Log VC运行库自动化安装脚本开始执行 INFO Write-Log 下载 $url 失败: $_ ERROR4.3 网络代理与下载重试机制在企业内网环境可能需要进行代理配置。此外网络下载不稳定需要加入重试逻辑。function Invoke-DownloadWithRetry { param( [string]$Url, [string]$OutFile, [int]$MaxRetries 3, [int]$RetryDelaySeconds 5 ) $retryCount 0 while ($retryCount -lt $MaxRetries) { try { # 可以在这里配置代理例如 # $proxy [System.Net.WebRequest]::GetSystemWebProxy() # $proxy.Credentials [System.Net.CredentialCache]::DefaultCredentials # $webClient.Proxy $proxy Invoke-WebRequest -Uri $Url -OutFile $OutFile -UseBasicParsing Write-Log 文件下载成功: $OutFile INFO return $true } catch { $retryCount Write-Log 第 $retryCount 次下载尝试失败: $_ WARN if ($retryCount -lt $MaxRetries) { Write-Log ${RetryDelaySeconds}秒后重试... WARN Start-Sleep -Seconds $RetryDelaySeconds } else { Write-Log 已达到最大重试次数($MaxRetries)下载失败。 ERROR return $false } } } }在主流程中将原来的Invoke-WebRequest调用替换为这个增强版的Invoke-DownloadWithRetry函数。4.4 生成安装报告脚本执行完毕后生成一个简单的HTML或文本报告汇总安装成功、失败、跳过的项目方便存档或发送通知。function New-InstallationReport { param( [array]$InstallationResults # 这是一个记录每个安装操作结果的对象数组 ) $reportPath .\InstallationReport_$(Get-Date -Format yyyyMMdd_HHmmss).html $html !DOCTYPE html html headtitleVC运行库安装报告/title style body { font-family: Consolas, monospace; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .success { background-color: #d4edda; } .failed { background-color: #f8d7da; } .skipped { background-color: #fff3cd; } /style /head body h2VC运行库自动化安装报告/h2 p生成时间: $(Get-Date)/p table trth包名/thth架构/thth状态/thth详情/错误码/th/tr foreach ($result in $InstallationResults) { $rowClass switch ($result.Status) { Success { success } Failed { failed } Skipped { skipped } default { } } $html tr class$rowClasstd$($result.PackageName)/tdtd$($result.Architecture)/tdtd$($result.Status)/tdtd$($result.Details)/td/tr } $html /table /body /html $html | Out-File -FilePath $reportPath -Encoding UTF8 Write-Log 安装报告已生成: $reportPath INFO }在主流程中你需要创建一个$results数组在每个安装步骤后向其中添加结果对象最后调用此函数生成报告。5. 常见问题与实战避坑指南在实际部署和运行这个自动化脚本的过程中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的解决方案。5.1 问题一安装程序返回错误代码“0x80070666”或“1638”现象安装2015-2022运行库时失败提示“已安装此产品的另一个版本”或直接返回错误代码0x80070666/1638。原因系统中已经存在一个相同或更高版本的VC 2015-2022运行库。微软的安装程序逻辑是不允许降级安装。解决方案在安装函数中我们已经处理了退出代码1638将其视为“成功跳过”。对于0x80070666它通常是一个HRESULT错误需要在调用安装程序前进行更精确的版本检测。我们可以修改检测逻辑对于2015-2022系列不仅检查是否存在还尝试检查已安装的版本号是否高于或等于我们要安装的版本。如果是则直接跳过。5.2 问题二在Windows Server Core或没有UI的系统上安装失败现象在某些服务器核心版或精简版系统上运行库安装失败可能提示需要某些图形界面组件。原因旧版本如2005、2008的安装程序可能依赖传统的Windows InstallerMSI引擎而某些服务器版本默认未安装完整的MSI服务或相关组件。解决方案优先使用静默参数确保使用的静默参数是正确的。对于基于MSI的安装包旧版参数可能是/quiet /norestart对于较新的独立安装程序如2015-2022参数是/install /quiet /norestart。启用服务器组件在Server Core上可能需要通过DISM命令启用“Server-GUI-Shell”或“Microsoft-Windows-Installation-UI-Package”等组件。但这会增加系统开销。终极方案——离线集成对于服务器批量部署更可靠的做法是在制作系统镜像如WIM文件时使用DISM命令将VC运行库的安装包直接集成到镜像中成为系统的一部分。这完全避免了在部署后运行时安装。5.3 问题三下载速度慢或链接失效现象从微软官方CDN下载速度极慢或者旧版本如2005的链接直接404。原因网络环境问题或微软已移除旧版本的直接下载链接。解决方案建立本地文件服务器这是企业环境的最佳实践。将所有需要的vcredist_*.exe文件下载到内部的文件服务器或网络共享上。修改脚本中的$VCRedistList将UrlX86和UrlX64指向本地网络路径如\\fileserver\software\vcredist\x86\vc_redist_2005_x86.exe。使用备用源一些可信的第三方网站或开源项目如“Microsoft Visual C Redistributable AIO”的发布页面会打包所有版本。你可以从中获取安装包但务必验证其哈希值以确保安全。脚本内嵌二进制数据对于非常小的部署包可以考虑将安装包转换成Base64字符串嵌入到PowerShell脚本中运行时再解码还原。但这会显著增大脚本体积不推荐用于大文件。5.4 问题四防病毒软件误报或拦截现象脚本或下载的安装程序被防病毒软件如Windows Defender、第三方杀软误报为病毒或潜在不受欢迎程序PUP。原因自动化下载和静默安装的行为模式可能被启发式扫描判定为可疑。解决方案数字签名如果你有能力为你的PowerShell脚本进行代码签名。这能大幅增加安全软件的信任度。白名单在企业环境中将你的脚本所在目录、缓存目录以及使用的本地安装包路径添加到防病毒软件的白名单中。提前沟通告知用户或运维团队此操作是安全的系统维护任务。使用计划任务在某些严格的环境中可以通过组策略部署一个签名的、已知良好的脚本作为计划任务来执行这比用户手动双击运行更不容易被拦截。5.5 问题五如何处理ARM64架构现象在基于ARM64的Windows设备如Surface Pro X Windows on ARM上运行脚本x86/x64的安装包无法运行或无效。原因ARM64设备需要原生ARM64版本的运行库。从VC 2015-2022开始微软提供了ARM64的独立安装包。解决方案更新你的“必备运行库清单”和架构判断逻辑。在清单中为2015-2022项添加UrlARM64的链接如https://aka.ms/vs/17/release/vc_redist.arm64.exe。修改架构判断逻辑$processorArchitecture $env:PROCESSOR_ARCHITECTURE if ($processorArchitecture -eq ARM64) { $archs (ARM64, x86) # ARM64设备通常也通过模拟器支持x86应用 } elseif ([Environment]::Is64BitOperatingSystem) { $archs (x64, x86) } else { $archs (x86) }注意在ARM64上安装x86版本可能需要系统已启用x86应用模拟支持。5.6 一个实用的“一键修复”脚本封装对于最终用户我们可以提供一个更简单的“一键修复”脚本。它不关心具体缺哪个而是尝试安装一个我们认为最全的合集例如2015-2022 x86/x64 2013 2012 2010。并且加入更友好的提示。Write-Host -ForegroundColor Cyan Write-Host VC 运行库一键修复工具 -ForegroundColor Cyan Write-Host -ForegroundColor Cyan Write-Host 此工具将自动检测并安装缺失的常用VC运行库。 -ForegroundColor Yellow Write-Host 安装过程可能需要几分钟请耐心等待并保持网络连接。 -ForegroundColor Yellow Write-Host n按任意键开始或按 CtrlC 取消... -ForegroundColor Gray $null $Host.UI.RawUI.ReadKey(NoEcho,IncludeKeyDown) try { # 调用我们之前写好的主函数但使用一个精简且必装的清单 Start-VCRedistAutoInstall -DownloadCacheDir $env:TEMP\VCRedistFix -ForceDownload:$false Write-Host n修复完成建议重启计算机以使所有更改生效。 -ForegroundColor Green } catch { Write-Host n修复过程中出现未预期的错误: $_ -ForegroundColor Red Write-Host 请将错误信息截图反馈给管理员。 -ForegroundColor Red } Write-Host n按任意键退出... -ForegroundColor Gray $null $Host.UI.RawUI.ReadKey(NoEcho,IncludeKeyDown)这个脚本给非技术用户使用非常合适它隐藏了复杂细节提供了明确的引导和反馈。
返回列表