【 Windows 操作系统】.bat 与 .ps1 的区别和作用
很多人“会用脚本”但说不清脚本。 真正的差距往往从bat 和 ps1 的理解深度开始拉开。一、为什么 Windows 会同时存在.bat和.ps1这是一个历史 架构演进的问题。.ps1是PowerShell脚本文件的扩展名用于编写和执行 PowerShell 脚本。.bat是 Windows 批处理脚本文件的扩展名用于编写和执行一系列 Windows 命令。1.1、.bat的诞生背景.batBatch File来自DOS 时代核心设计目标只有一个把人工在命令行里敲的命令一次性自动执行所以它的设计思想是命令逐行执行一切皆字符串几乎没有“语言设计”1.2、.ps1的出现原因随着 Windows 成为服务器操作系统、企业级平台仅靠 bat 已经不够需要批量管理服务需要操作注册表、AD、WMI需要结构化数据XML / JSON需要远程管理于是PowerShell诞生了而.ps1是它的脚本载体。PowerShell 不是 CMD 的升级版而是全新的自动化平台二、.bat是什么2.1、执行模型执行程序cmd.exe执行方式逐行解释失败不会自动终止除非你自己判断cmd.exe /c test.bat2.2、核心特征无对象概念变量全是字符串依赖系统内置命令错误处理极弱2.3、bat 的“变量系统”set VARvalue echo %VAR%⚠️ 注意%VAR%是文本替换不是运行时计算循环里要用!VAR!延迟展开三、.bat的完整语法体系3.1、基本结构echo off rem 这是注释 echo Hello World pause关键字含义echo off关闭命令回显未关闭回显时每条命令都会先被打印出来再执行并显示结果。rem注释rem 为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显::用于进行文本的注释执行后即使打开echo on也不会回显内容pause等待按键用于暂停批处理脚本执行,显示本地化提示(如‘请按任意键继续...’),并等待用户任意按键后才继续。其核心价值在于防止命令窗口闪退echo off title REM 和 :: 最小回显测试 echo 先关闭回显 echo. pause echo on REM 这一行是 REM :: 这一行是 :: echo 这一行是普通 echo 输出 echo off echo. echo 测试完成 pause执行后结果如下所示3.2、条件判断ifecho off title IF 输入判断示例 set /p a请输入一个数字 if %a%1 ( echo 你输入的是 1 ) else ( echo 你输入的不是 1 ) pause常见判断existerrorlevelif %errorlevel% neq 0 echo 执行失败这是 bat 最容易写出 bug 的地方。3.3、循环forecho off for %%i in (*.txt) do echo 找到文件%%i pausefor /f最反人类的语法/f表示按行读取文本内容并进行解析。echo off title 获取本机 IPv4 地址示例 echo 正在获取本机 IPv4 地址... echo. for /f tokens2 delims: %%i in (ipconfig ^| findstr /i IPv4) do echo 本机IPv4地址%%i echo. pausebat 最大的痛点能做的事 ≠ 好做的事四、.ps1是什么4.1、本质定位.ps1是PowerShell 脚本文件而 PowerShell 本身是基于 .NET 的面向对象自动化语言这句话极其重要。4.2、执行模型执行程序powershell.exe/pwsh.exe命令返回的不是文本而是对象Get-Service返回的是System.ServiceProcess.ServiceController而不是字符串。五、.ps1的语法体系5.1、变量与类型$name Windows $count 10支持强类型[int]$port 443Windows 默认不允许直接运行.ps1脚本运行需要配置如下命令配置只对当前 PowerShell 临时允许Set-ExecutionPolicy RemoteSigned -Scope CurrentUser5.2、条件判断if$port 443 if ($port -eq 443) { Write-Host HTTPS } else { Write-Host Other }对比 bat可读性直接碾压5.3、循环foreach / forforeach ($svc in Get-Service) { if ($svc.Status -eq Stopped) { Write-Host $svc.Name } }这里$svc是对象不是字符串。5.4、管道PowerShell 灵魂Get-Service | Where-Object Status -eq Running这就是 PowerShell 能彻底干掉 bat 的原因。5.5、函数企业级脚本必备function Restart-MyService { param($Name) Restart-Service $Name }六、执行策略为什么 ps1 默认跑不了6.1、执行策略是什么PowerShell 引入了Execution Policy防止脚本被恶意执行常见策略策略含义Restricted禁止脚本RemoteSigned本地允许Bypass全放行6.2、企业最常用方式powershell -ExecutionPolicy Bypass -File deploy.ps1注意这是“临时放行”不改系统策略。七、.bat与.ps1的工程级对比维度batps1自动化能力低极高可维护性差好错误处理原始完整日志能力几乎没有原生支持适合规模小中 / 大企业标准淘汰中主流bat 能跑 ps1 能长期维护八、真实企业场景建议8.1、不再用 bat 的场景安全整改脚本批量系统配置运维巡检自动化部署8.2、ps1 的黄金场景等保 / 分保脚本批量漏洞修复服务巡检日志采集AD / 注册表管理九、一个现实真相很多“只会 bat 的运维” 本质上还停留在人工命令自动化阶段而 PowerShell 做的是系统能力的程序化控制这是两个时代。.bat是历史的产物.ps1是 Windows 自动化的基石懂 bat 是入门 精通 ps1 才是职业护城河十、【实战】Windows信息检查脚本功能说明检查Windows主机的硬件配置系统安装时间系统版本硬件序列号等。具体脚本内容GetSystemInfo.ps1文件内容如下所示# # 版权所有 © 2026 笨熊呆呆瓜 # 联系方式842668578qq.com # 用途收集本机系统信息时间、主机名、用户、BIOS、硬盘、IP与MAC等 # # 确保脚本路径正确 $scriptDir if ($PSScriptRoot) { $PSScriptRoot } else { Get-Location } Set-Location -Path $scriptDir # 获取时间、主机名、用户、操作系统信息 $timestamp Get-Date -Format yyyy-MM-dd_HH-mm-ss $hostname $env:COMPUTERNAME $username $env:USERNAME $osinfo Get-CimInstance Win32_OperatingSystem $osname $osinfo.Caption $installTime $osinfo.InstallDate.ToLocalTime().ToString(yyyy-MM-dd HH:mm:ss) # 构造输出文件路径 $outputFile Join-Path $scriptDir system_info_${hostname}_${timestamp}.txt # 初始化输出 Set-Content -Path $outputFile -Value 系统信息收集 -Encoding UTF8 Add-Content -Path $outputFile -Value 导出时间$timestamp -Encoding UTF8 Add-Content -Path $outputFile -Value 系统安装时间$installTime -Encoding UTF8 Add-Content -Path $outputFile -Value 主机名$hostname -Encoding UTF8 Add-Content -Path $outputFile -Value 当前用户$username -Encoding UTF8 Add-Content -Path $outputFile -Value 操作系统$osname -Encoding UTF8 Add-Content -Path $outputFile -Value -Encoding UTF8 # BIOS 序列号 Add-Content -Path $outputFile -Value [设备序列号 - BIOS SerialNumber] -Encoding UTF8 (Get-CimInstance Win32_BIOS).SerialNumber | Add-Content -Path $outputFile -Encoding UTF8 Add-Content -Path $outputFile -Value -Encoding UTF8 # 物理硬盘序列号 Add-Content -Path $outputFile -Value [硬盘序列号 - Disk Serial Numbers] -Encoding UTF8 Get-PhysicalDisk | ForEach-Object { 硬盘: $($_.FriendlyName) - 序列号: $($_.SerialNumber) | Add-Content -Path $outputFile -Encoding UTF8 } Add-Content -Path $outputFile -Value -Encoding UTF8 # 网卡 IP 和 MAC 配对输出清晰配对 Add-Content -Path $outputFile -Value [网络接口 - IP 与 MAC 地址配对] -Encoding UTF8 $adapters Get-NetAdapter | Where-Object { $_.Status -eq Up } foreach ($adapter in $adapters) { $name $adapter.Name $mac $adapter.MacAddress $ips Get-NetIPAddress -InterfaceAlias $name -AddressFamily IPv4 | Where-Object { $_.IPAddress -ne $null } if ($ips.Count -eq 0) { Add-Content -Path $outputFile -Value 接口: $name -Encoding UTF8 Add-Content -Path $outputFile -Value IP地址: 无 -Encoding UTF8 Add-Content -Path $outputFile -Value MAC地址: $mac -Encoding UTF8 } else { foreach ($ip in $ips) { Add-Content -Path $outputFile -Value 接口: $name -Encoding UTF8 Add-Content -Path $outputFile -Value IP地址: $($ip.IPAddress) -Encoding UTF8 Add-Content -Path $outputFile -Value MAC地址: $mac -Encoding UTF8 } } Add-Content -Path $outputFile -Value -Encoding UTF8 } # 控制台驻留兼容所有 PowerShell 版本 Write-Host n系统信息已导出到 -NoNewline Write-Host $outputFile -ForegroundColor Green Write-Host 请按任意键退出... [void][System.Console]::ReadKey($true)BAT文件RunSystemInfo.bat内容如下所示echo off :: :: 版权所有 © 2026 笨熊呆呆瓜 :: 联系方式842668578qq.com :: 用途调用 PowerShell 脚本收集本机系统信息 :: powershell -ExecutionPolicy Bypass -NoExit -File %~dp0GetSystemInfo.ps1运行BAT文件执行过程如下所示生成如下结果文件文件内容如下所示
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415723.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!