plugins/languages/powershell/skills/windows-shell/SKILL.md
Windows cmd.exe and batch script (.bat / .cmd) compatibility subset for cases when PowerShell is unavailable or wrappers must run under legacy contexts. Covers setlocal / endlocal, enabledelayedexpansion (!var! vs %var%), %~dp0 / %~nx0 / %~f0 modifiers, errorlevel checks, FOR /F loops, doskey limits, argument quoting hazards, .bat vs .cmd differences, and decision rules for when to fall back to batch versus invoking pwsh. Use proactively when the user asks "写 batch 脚本 / cmd 脚本 / .bat / .cmd / Windows 批处理 / 调用 cmd". Also triggers on "cmd.exe", "batch", "setlocal", "errorlevel", "%~dp0", "doskey".
npx skillsauth add lazygophers/ccplugin powershell-windows-shellInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
PowerShell 是 Windows 自动化首选。仅在以下场景退回 batch:
任何复杂逻辑(数组 / 字典 / 错误处理)都不要写 batch;写
.ps1后用.cmdwrapper 启动。
.bat vs .cmd| 差异 | .bat | .cmd |
|------|--------|--------|
| 出身 | DOS 4DOS | Windows NT |
| ERRORLEVEL 在内部命令后行为 | 不更新 | 更新 |
| 兼容性 | 老系统也认 | NT 起 |
新脚本一律 .cmd。.bat 只为最大兼容性(极少需要)。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
chcp 65001 >nul :: UTF-8(处理中文输出更稳)
set "SCRIPT_DIR=%~dp0" :: 脚本所在目录(带尾部 \)
set "SCRIPT_NAME=%~nx0"
@echo off:抑制命令回显(脚本第一行)。setlocal:把变量作用域限制到当前脚本(结束时自动 endlocal)。EnableDelayedExpansion:开启 !var! 实时展开,循环内必备。chcp 65001:UTF-8 代码页(Win 10 1903+ 稳定)。%0 脚本名(如调用方式中所写)
%~0 去除引号
%~f0 完整路径
%~d0 驱动器(C:)
%~p0 路径(不含驱动器)
%~dp0 驱动器 + 路径(脚本所在目录,**最常用**)
%~n0 文件名(不含扩展)
%~x0 扩展名
%~nx0 文件名 + 扩展
%~s0 短 8.3 路径
%~a0 属性
%~t0 修改时间
%~z0 大小
参数 %1 %2 ... 同理可叠加修饰符。%* 是全部参数。
set "name=alpha"
echo %name% :: 解析时展开
setlocal EnableDelayedExpansion
for %%i in (a b c) do (
set "current=%%i"
echo %current% :: ❌ 永远空(解析时一次性展开)
echo !current! :: ✅ 运行时展开
)
记住:%var% 在解析整段块时展开一次;!var! 在每次执行时展开。FOR / IF 块内总用 !。
some_command.exe
if errorlevel 1 (
echo failed
exit /b 1
)
:: 等价显式
some_command.exe
if %ERRORLEVEL% neq 0 exit /b %ERRORLEVEL%
注意:if errorlevel N 测试 >=N,不是 ==N。精确比较用 %ERRORLEVEL% equ N。
:: 遍历文件行
for /f "usebackq tokens=1,2 delims=:" %%a in ("config.txt") do (
echo key=%%a value=%%b
)
:: 捕获命令输出
for /f "usebackq delims=" %%i in (`git rev-parse HEAD`) do set "sha=%%i"
echo %sha%
| 选项 | 含义 |
|------|------|
| usebackq | 反引号执行命令 / 双引号是字符串 |
| tokens=1,2 | 取第 1、2 段 |
| delims=: | 分隔符 |
| skip=1 | 跳过开头 N 行 |
| eol=# | 行注释起始字符 |
@echo off
call :greet "world"
exit /b 0
:greet
setlocal
set "name=%~1"
echo Hello, %name%!
endlocal
exit /b 0
call :label 进函数,exit /b N 返回并设 errorlevel。
@echo off
:: 任何超过 20 行的逻辑:写 .ps1,这里只做 wrapper
where pwsh >nul 2>nul && (
pwsh -NoProfile -ExecutionPolicy Bypass -File "%~dp0script.ps1" %*
) || (
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0script.ps1" %*
)
exit /b %ERRORLEVEL%
pwsh 是 PowerShell 7+,powershell 是 Windows PowerShell 5.1。-NoProfile 避免加载用户 profile(启动快、行为可预测)。-ExecutionPolicy Bypass 仅对当前进程,不改系统策略。batch 的引号处理极其反直觉:
set "var=hello world" :: ✅ 推荐:等号紧贴变量名,引号包整体
set var="hello world" :: ❌ var 的值真的含引号
if "%var%"=="hello" (...) :: ✅ 标准比较
:: 含空格的路径
"%~dp0bin\tool.exe" arg1 arg2 :: ✅
%~dp0bin\tool.exe arg1 arg2 :: ❌ 空格断行
doskey 定义 cmd 别名 仅当前 cmd 会话有效,且无法在 batch 内供后续行使用。别想用 doskey 写脚本。Windows 上"持久别名"的方案:
Set-Alias + $PROFILE。| 反模式 | 修正 |
|--------|------|
| 复杂逻辑用 batch | 改 .ps1 + .cmd wrapper |
| goto :EOF 当函数返回 | OK,但配合 call :label 与 exit /b 更明确 |
| 循环内忘记 EnableDelayedExpansion | 顶部加 setlocal |
| 引号 set var="x" 包含引号 | set "var=x" |
| 用 %var% 期望循环内更新 | 改 !var! |
| 忽略 errorlevel | 每个关键命令后 if errorlevel 1 exit /b 1 |
| 硬编码 C:\... | %~dp0 相对脚本 |
| 不设代码页 | 中文乱码;加 chcp 65001 |
| 需求 | batch 够? | 推荐 | |------|-----------|------| | 启动一个程序 + 设环境变量 | ✅ | batch wrapper | | 解析 JSON / 调用 REST | ❌ | PowerShell | | 错误恢复 / 复杂控制流 | ❌ | PowerShell | | 数组 / 字典 | ❌ | PowerShell | | 跨主版本兼容(XP+)启动器 | ✅ | batch | | 调用 MSI 安装 | ✅ | batch | | 文件批量处理 ≤ 5 行 | ✅ | batch / forfiles | | 调用 git / docker 流水 | △ | 倾向 PowerShell |
:: 临时回显
@echo on
:: 步进
pause :: 等用户按键
echo DEBUG: var=[%var%] :: 打印中间状态
:: 完整 trace
cmd /c "yourscript.cmd args" 2>&1 | tee trace.log
.cmd(除非真需 .bat)@echo off + setlocal EnableExtensions EnableDelayedExpansion%~dp0 相对脚本set "var=value"!var!.ps1,batch 仅 wrapperchcp 65001exit /b Ntools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。