1. Windows命令行的前世今生
作为一名在Windows环境下摸爬滚打多年的运维老兵,我见证了命令行工具从DOS时代到PowerShell的进化历程。很多人可能不知道,Windows命令行(cmd.exe)实际上是MS-DOS的延续,而PowerShell则是微软在2006年推出的更强大的脚本环境。
提示:虽然图形界面越来越友好,但命令行在批量操作、远程管理和自动化任务方面依然具有不可替代的优势
在Windows 10/11中,我们实际上有三个主要的命令行环境:
- 传统的CMD(cmd.exe)
- PowerShell(powershell.exe)
- Windows Terminal(新一代终端)
我强烈推荐使用Windows Terminal作为日常工作的主终端,它不仅支持多标签页、分屏,还能同时运行CMD和PowerShell,甚至可以通过WSL运行Linux命令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 运维必备的核心命令库
2.1 系统信息收集命令
当接手一台新服务器时,快速了解系统状况是首要任务。以下是我常用的"体检"命令:
bash复制systeminfo # 获取完整的系统配置信息
wmic bios get serialnumber # 获取BIOS序列号(硬件标识)
wmic memorychip get capacity # 查看内存容量
wmic diskdrive get size # 查看磁盘容量
wmic cpu get name # 获取CPU型号
这些命令在排查硬件问题时特别有用。比如上周我们机房有台服务器频繁蓝屏,就是通过wmic memorychip发现有一条内存接触不良。
2.2 网络诊断工具集
网络问题是运维的日常,Windows自带了很多强大的网络工具:
bash复制ipconfig /all # 查看完整网络配置
ping -t 192.168.1.1 # 持续ping测试(Ctrl+C停止)
tracert www.baidu.com # 路由追踪
netstat -ano # 查看所有网络连接和对应进程
netsh interface ip show config # 查看接口详细配置
遇到网络故障时,我的标准排查流程是:
- 先用
ping 127.0.0.1检查本地TCP/IP协议栈 - 然后
ping 网关IP检查内网连通性 - 最后
ping 公网IP检查外网连接
2.3 进程与服务管理
服务器卡顿时,快速定位问题进程是基本功:
bash复制tasklist /svc # 查看进程列表及关联服务
taskkill /F /PID 1234 # 强制结束指定PID的进程
sc query state=all # 查看所有服务状态
sc stop "ServiceName" # 停止指定服务
注意:强制结束进程可能导致数据丢失,生产环境慎用/F参数
3. 批处理脚本开发实战
3.1 基础批处理语法
批处理(.bat文件)是Windows下最简单的自动化工具。分享几个实用技巧:
bat复制@echo off # 关闭命令回显
setlocal # 变量作用域限定在当前脚本
set var=value # 变量赋值
echo %date% %time% # 显示日期时间
timeout /t 5 # 等待5秒
我常用的模板结构:
bat复制@echo off
setlocal enabledelayedexpansion
:: 主逻辑
call :subroutine
:: 子程序
:subroutine
echo 执行子程序
exit /b 0
3.2 实战案例:自动备份脚本
下面这个脚本我用了5年,每天凌晨自动备份重要数据:
bat复制@echo off
set BACKUP_DIR=D:\Backup
set SOURCE_DIR=E:\Data
set LOG_FILE=%BACKUP_DIR%\backup.log
echo [%date% %time%] 开始备份 >> %LOG_FILE%
if not exist "%BACKUP_DIR%" (
mkdir "%BACKUP_DIR%"
)
robocopy "%SOURCE_DIR%" "%BACKUP_DIR%\%date:/=-%" /MIR /Z /R:3 /W:5 /LOG+:%LOG_FILE%
echo [%date% %time%] 备份完成 >> %LOG_FILE%
关键参数说明:
/MIR:镜像模式(保持完全一致)/Z:支持断点续传/R:3:失败重试3次/W:5:重试间隔5秒
3.3 错误处理进阶
完善的错误处理是专业脚本的标志:
bat复制@echo off
setlocal
call :main > output.log 2>&1
exit /b %errorlevel%
:main
rem 主逻辑
if not exist "input.txt" (
echo 错误:找不到输入文件
exit /b 1
)
rem 正常执行
exit /b 0
这个模板实现了:
- 输出重定向到日志文件
- 错误代码传递
- 基本的输入校验
4. PowerShell的强大能力
4.1 与CMD的对比
虽然CMD仍然可用,但PowerShell在以下方面有明显优势:
- 面向对象(命令返回的是对象而非文本)
- 更强大的管道功能
- 丰富的内置命令(称为cmdlet)
- 支持.NET Framework
4.2 常用运维场景示例
获取系统信息:
powershell复制Get-WmiObject Win32_OperatingSystem | Select-Object Caption,Version
Get-Process | Where-Object { $_.CPU -gt 50 } | Sort-Object CPU -Descending
批量修改文件:
powershell复制Get-ChildItem *.log | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item
远程管理:
powershell复制$sessions = New-PSSession -ComputerName Server1,Server2
Invoke-Command -Session $sessions -ScriptBlock { Get-Service }
4.3 我的PowerShell配置
这是我的$PROFILE文件内容,分享给大家:
powershell复制# 设置别名
Set-Alias grep Select-String
Set-Alias ll Get-ChildItem
# 自定义提示符
function prompt {
$path = ($pwd.Path -replace [regex]::Escape($HOME), "~")
"[$env:COMPUTERNAME]$path> "
}
# 历史命令增强
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -HistorySearchCursorMovesToEnd
5. 第三方命令行工具推荐
5.1 效率工具
-
Sysinternals Suite:微软官方的神器集合
procexp:进程浏览器autoruns:启动项管理tcpview:网络连接监控
-
Chocolatey:Windows下的包管理器
powershell复制choco install git -y choco install 7zip -y
5.2 开发辅助
-
jq:JSON处理工具
bash复制curl http://api.example.com/data | jq ".items[].name" -
ffmpeg:多媒体处理
bash复制
ffmpeg -i input.mp4 -c:v libx264 output.mp4
5.3 我的工具箱配置
我习惯把这些工具都放在C:\Tools下,然后添加到PATH:
powershell复制$env:PATH += ";C:\Tools\Sysinternals;C:\Tools\ffmpeg\bin"
同时会维护一个tools.ps1脚本,新环境一键配置:
powershell复制# 下载并解压Sysinternals
Invoke-WebRequest https://download.sysinternals.com/files/SysinternalsSuite.zip -OutFile sysinternals.zip
Expand-Archive sysinternals.zip -DestinationPath C:\Tools\Sysinternals
# 安装Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
6. 实战:构建自动化运维体系
6.1 定时任务管理
Windows自带的计划任务其实很强大:
powershell复制# 创建每天凌晨3点运行的备份任务
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger -User "SYSTEM"
查看现有任务:
powershell复制Get-ScheduledTask | Where-Object { $_.State -ne "Disabled" } | Format-Table TaskName,State
6.2 集中式日志收集
简单的日志集中管理方案:
powershell复制# 在所有服务器上创建日志收集脚本
$script = {
$log = Get-EventLog -LogName System -EntryType Error -After (Get-Date).AddDays(-1)
$log | Export-Csv "\\logserver\share\$env:COMPUTERNAME-system-errors.csv" -NoTypeInformation
}
# 远程执行
Invoke-Command -ComputerName Server1,Server2,Server3 -ScriptBlock $script
6.3 监控告警系统
基于PowerShell的简易监控:
powershell复制# 监控CPU使用率
while ($true) {
$cpu = Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average | Select-Object -ExpandProperty Average
if ($cpu -gt 90) {
Send-MailMessage -From "monitor@company.com" -To "admin@company.com" `
-Subject "CPU告警 - $env:COMPUTERNAME" -Body "CPU使用率: $cpu%" `
-SmtpServer "smtp.company.com"
}
Start-Sleep -Seconds 300
}
7. 安全最佳实践
7.1 最小权限原则
- 日常操作使用普通用户账号
- 需要提升权限时使用
runas:cmd复制runas /user:Administrator "cmd.exe" - 在PowerShell中使用
-Credential参数:powershell复制$cred = Get-Credential Start-Process powershell.exe -Credential $cred -ArgumentList "-File script.ps1"
7.2 脚本签名
给重要脚本添加数字签名:
powershell复制# 创建自签名证书
$cert = New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyScriptSigningCert" -KeyUsage DigitalSignature
# 签名脚本
Set-AuthenticodeSignature -FilePath .\script.ps1 -Certificate $cert
# 设置执行策略
Set-ExecutionPolicy AllSigned -Scope LocalMachine
7.3 安全审计
记录所有特权操作:
powershell复制# 启用进程创建审计
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enable
# 查看安全日志
Get-WinEvent -LogName Security -FilterXPath "*[System[EventID=4688]]" |
Select-Object TimeCreated, @{n="User";e={$_.Properties[1].Value}}, @{n="Process";e={$_.Properties[5].Value}}
8. 性能优化技巧
8.1 命令执行加速
-
使用
where /r代替dir /s进行文件搜索:cmd复制
where /r C:\ *.config -
在PowerShell中避免使用
ForEach-Object处理大数据集:powershell复制# 慢 Get-Process | ForEach-Object { $_.Name } # 快 (Get-Process).Name
8.2 内存优化
处理大文件时使用流式处理:
powershell复制# 内存高效的文件处理
$reader = [System.IO.File]::OpenText("largefile.log")
while ($null -ne ($line = $reader.ReadLine())) {
# 处理每一行
}
$reader.Close()
8.3 并行处理
利用PowerShell的并行能力:
powershell复制# 并行ping测试
$servers = "server1","server2","server3"
$jobs = $servers | ForEach-Object {
Start-Job -ScriptBlock { param($s) Test-Connection $s -Count 2 } -ArgumentList $_
}
$results = $jobs | Wait-Job | Receive-Job
$results | Format-Table
9. 跨平台协作方案
9.1 与Linux系统交互
通过WSL实现无缝协作:
bash复制# 在Windows中运行Linux命令
wsl ls -la /var/log
# 在Linux中访问Windows文件
explorer.exe .
9.2 文件传输优化
使用robocopy进行可靠传输:
cmd复制robocopy C:\Data \\linuxserver\share /MIR /Z /TEE /LOG:transfer.log
9.3 统一脚本环境
在Windows和Linux上都能运行的脚本技巧:
bash复制#!/usr/bin/env sh
# 这段脚本在PowerShell和Bash中都能运行
if [ -n "$WSL_DISTRO_NAME" ]; then
echo "Running in WSL"
else
echo "Running in native Windows"
fi
10. 我的命令行工作流
10.1 终端配置
这是我的Windows Terminal配置片段:
json复制{
"profiles": {
"defaults": {
"font": {
"face": "Cascadia Code PL",
"size": 11
},
"colorScheme": "One Half Dark",
"useAcrylic": true,
"acrylicOpacity": 0.85
},
"list": [
{
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"name": "PowerShell 7",
"commandline": "pwsh.exe",
"hidden": false
}
]
}
}
10.2 常用命令别名
我的常用别名设置:
powershell复制# PowerShell profile
function which($command) { Get-Command $command | Select-Object -ExpandProperty Definition }
function grep($pattern) { Select-String $pattern }
function df { Get-Volume | Format-Table -AutoSize }
function uptime { (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime }
# CMD的doskey宏
doskey ls=dir /b $*
doskey clear=cls $*
10.3 问题诊断流程
当遇到系统问题时,我的标准诊断流程:
-
收集基本信息:
powershell复制systeminfo | Out-File diagnosis.txt Get-WinEvent -LogName System -MaxEvents 50 | Export-Csv events.csv -
性能快照:
powershell复制Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | Export-Csv top_processes.csv Get-Counter '\Memory\Available MBytes' | Export-Csv memory.csv -
网络状态:
powershell复制netstat -ano | Out-File connections.txt Test-NetConnection www.example.com | Out-File network_test.txt
这套工作流帮助我快速定位了90%以上的系统问题。命令行的高效之处在于,所有这些诊断步骤都可以脚本化,一键执行并生成完整的诊断报告。
