windows-shell-syntax

帮助用户正确区分并使用Windows的PowerShell、cmd等命令行语法,避免跨平台错误。

已扫描
适合谁
Windows开发者、系统管理员
不适合谁
仅使用Linux/macOS的用户、无需处理多壳层命令的初学者
国内可用性
国内友好。面向国内用户较友好。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @loevery/windows-shell-syntax

Skill 说明

命令、参数、文件名以原文为准

Windows Shell 语法

当用户在 Windows 系统上询问终端命令、Shell 脚本、转义规则,或要求对比 Windows 与 Linux 终端语法时,请使用此技能。

首要原则:识别所用 Shell

不要将“Windows 终端语法”当作一个统一的概念。

在 Windows 上,必须区分以下几种环境:

  • PowerShellpowershellpwsh
  • cmd.execmd
  • Git Bash / WSL bash(运行在 Windows 上的类 Unix Shell)

注意:Windows Terminal 只是一个终端应用程序,可同时承载多个 Shell。

如果无法确定用户使用的 Shell:

  • 请明确询问他们使用的是哪种 Shell,
  • 分别提供 PowerShell:cmd: 的命令示例。

严格规则

除非用户明确说明正在使用以下任意一种环境,否则绝不向 cmd 或 PowerShell 用户提供仅适用于 Bash 的语法:

  • Git Bash
  • WSL
  • MSYS2
  • Cygwin
  • 远程 Linux Shell

以下为不应直接传递给 cmd/PowerShell 用户的 Bash 特有习惯(如未标注说明):

  • export NAME=value
  • 在 cmd 中使用 $VAR 表示环境变量
  • 默认使用反斜杠转义(如 \"
  • rmmvcp 当作原生 cmd 命令
  • 使用 \ 实现行续接

&& / || 兼容性规则

不要说“Windows 不支持 &&”。

实际兼容性矩阵如下:

  • cmd.exe:支持 &&&||
  • PowerShell 7+:支持 &&||
  • Windows PowerShell 5.1不支持 &&||
  • Git Bash / WSL:支持 &&||

因此,问题核心是 具体使用哪个 Shell 以及 PowerShell 版本,而非简单地“是否在 Windows”。

未知 PowerShell 版本时的安全默认策略

若仅知用户处于 PowerShell 环境,但不确定是:

  • Windows PowerShell 5.1powershell
  • PowerShell 7+pwsh / 现代 PowerShell)

应避免使用 && / ||,改用显式的条件判断逻辑。

快速对照表

转义 / 引号处理

cmd.exe

  • 特殊字符转义使用 ^
  • 常见特殊字符:& | ( ) < > ^
  • 示例:在 cmd 中表示一个字面引号:^"
  • 路径含空格时使用 "..."
  • 环境变量写法:%USERPROFILE%
  • 行续接:在行尾使用 ^
  • 命令链:

- 总是执行下一条:&

- 成功后执行下一条:&&

- 失败后执行下一条:||

PowerShell

  • 推荐使用单引号 '...' 表示纯文本字符串
  • 双引号 "..." 支持变量展开和插值
  • 转义字符为反引号:` ``
  • 字面双引号通常无需额外转义,只要整个字符串用单引号包裹即可
  • 环境变量写法:$env:USERPROFILE
  • 行续接:一般避免;如需可用反引号结尾,但更推荐使用 splatting 或括号提升可读性
  • PowerShell 7+ 支持 && / ||
  • Windows PowerShell 5.1 不支持 && / ||
  • 若需兼容性,优先使用显式 if 判断,而非管道链操作符

Bash

  • 转义字符:\
  • 强制字面量引用:'...'
  • 支持变量展开的引用:"..."
  • 环境变量写法:$HOME$VAR
  • 行续接:在行尾使用 \

安全回答模板

当用户请求命令但未指定 Shell 时,应优先采用以下结构:

PowerShell:
<命令>

cmd:
<命令>

禁止仅提供一个未标注的命令,尤其当不同 Shell 语法存在差异时。

若版本兼容性重要,应采用以下结构:

PowerShell 5.1 兼容:
<命令>

PowerShell 7+:
<命令>

cmd:
<命令>

重写规则

1. 命令链处理

若原本计划使用 Bash 链接方式,请根据实际 Shell 重写:

  • Bash:cmd1 && cmd2
  • cmd:cmd1 && cmd2
  • PowerShell 7+:cmd1 && cmd2
  • PowerShell 5.1 兼容:cmd1; if ($?) { cmd2 }

示例:

PowerShell 5.1 兼容:
cmd1
if ($?) { cmd2 }

PowerShell 7+:
cmd1 && cmd2

cmd:
cmd1 && cmd2

2. 替换 && 的方法

当用户反馈 && 无效时,首先推断其可能的 Shell 环境:

  • 若用户使用 Windows PowerShell 5.1,替换为:

- cmd1 && cmd2cmd1; if ($?) { cmd2 }

- cmd1 || cmd2cmd1; if (-not $?) { cmd2 }

  • 若用户使用 cmd,保留 && / ||
  • 若用户使用 PowerShell 7+&& / || 有效,通常可保持不变

对于 PowerShell 中的原生可执行文件(如 .exe 或外部 CLI),若需精确控制退出码行为,建议使用更明确的形式:

cmd1
if ($LASTEXITCODE -eq 0) { cmd2 }

该写法特别适用于左操作数为 .exe 或外部命令且需准确判断进程退出状态的场景。

3. 环境变量设置

  • Bash:export NAME=value
  • PowerShell:$env:NAME = 'value'
  • cmd:set NAME=value

读取变量值:

  • Bash:$NAME
  • PowerShell:$env:NAME
  • cmd:%NAME%

4. 含空格的路径

始终对包含空格的 Windows 路径进行引号包裹:

  • PowerShell:"C:\Program Files\App"
  • cmd:"C:\Program Files\App"

5. 嵌套引号处理

  • 若用户在 cmd 环境中,需注意使用 ^ 转义特殊字符及引号敏感场景。
  • 若用户在 PowerShell 环境中,优先通过改变引号风格来避免复杂转义。

示例:

PowerShell:
python -c 'print("hello")'

cmd:
python -c "print(^\"hello^\")"

cmd 示例应保持简洁、测试感强;因为 cmd 引号处理极易混乱。

6. 多行命令

优先使用各 Shell 的原生多行写法:

PowerShell:
& python `
  script.py `
  --name test

cmd:
python ^
  script.py ^
  --name test

若单行命令可接受,则优先选择单行形式。

6.5 引号陷阱:尽量避免

对于 cmdPowerShell,深层嵌套引号极易变得脆弱,尤其在以下情况:

  • python -c "..."
  • 命令行内直接传入 JSON
  • 包含引号和反斜杠的正则表达式模式
  • 嵌套在另一 Shell 命令中的子命令

一旦引号处理开始变得复杂,应优先考虑重构命令,而非强行完美转义。

首选安全替代方案:

  • 将内容放入脚本文件中并运行该文件
  • 将 JSON 内容放入文件中,并传递文件路径
  • 在 PowerShell 中,尽可能使用外层单引号、内层双引号
  • 在 cmd 中,尽量将复杂逻辑移出命令行本身
  • 如果两种 shell 都可行,优先提供 PowerShell 变体,而非强行使用复杂的 cmd 示例

经验法则:如果示例需要一段文字来解释转义规则,应重写实现方式。

6.6 重定向/管道陷阱:优先使用简单模式

Windows shell 在重定向和管道行为上差异较大。

  • cmd 的管道是基于文本的
  • PowerShell 的管道在命令间传递的是对象
  • stderr/stdout 重定向在原生命令、cmd 和 PowerShell 之间可能表现不同

如果某个命令依赖复杂的重定向逻辑,优先采用更简单的模式:

  • 先将输出写入文件,再读取或处理该文件
  • 将命令拆分为多个独立步骤,而非一个密集的管道链
  • 在 PowerShell 中,当清晰性更重要时,优先使用显式的变量,而非巧妙的管道链式调用
  • 提供跨 shell 的答案时,除非明确标注 shell 特异性,否则避免使用高级重定向

经验法则:如果正确性依赖于细微的管道或重定向语义,应选择更显式的多步形式。

7. Bash → Windows 重写速查表

当用户粘贴 Bash 命令并希望获得 Windows 等效命令时,可参考此部分。

cmd1 && cmd2

Bash:
cmd1 && cmd2

PowerShell 5.1 兼容:
cmd1
if ($?) { cmd2 }

PowerShell 7+:
cmd1 && cmd2

cmd:
cmd1 && cmd2

cmd1 || cmd2

Bash:
cmd1 || cmd2

PowerShell 5.1 兼容:
cmd1
if (-not $?) { cmd2 }

PowerShell 7+:
cmd1 || cmd2

cmd:
cmd1 || cmd2

export NAME=value

Bash:
export NAME=value

PowerShell:
$env:NAME = 'value'

cmd:
set NAME=value

echo $NAME

Bash:
echo $NAME

PowerShell:
echo $env:NAME

cmd:
echo %NAME%

~/file.txt

Bash:
cat ~/file.txt

PowerShell:
Get-Content $HOME\file.txt

cmd:
type %USERPROFILE%\file.txt

rm, cp, mv

Bash:
rm file.txt
cp a.txt b.txt
mv a.txt b.txt

PowerShell:
Remove-Item file.txt
Copy-Item a.txt b.txt
Move-Item a.txt b.txt

cmd:
del file.txt
copy a.txt b.txt
move a.txt b.txt

VAR=value command

此 Bash 模式在 PowerShell 或 cmd 中没有完全对应的语法形式。

Bash:
NAME=value mytool

PowerShell:
$env:NAME = 'value'
mytool

cmd:
set NAME=value
mytool

如果临时作用域的行为很重要,请说明:Bash 可以将环境变量作用域限定为单个命令,而 PowerShell/cmd 的示例通常需要额外清理操作才能实现真正的单命令作用域。

`command \

--flag value`

Bash:
command \
  --flag value

PowerShell:
command `
  --flag value

cmd:
command ^
  --flag value

grep pattern file.txt

Bash:
grep pattern file.txt

PowerShell:
Select-String pattern file.txt

cmd:
findstr pattern file.txt

pwdls

Bash:
pwd
ls

PowerShell:
Get-Location
Get-ChildItem

cmd:
cd
dir

注意:lspwd 在 PowerShell 中可能看似可用,是因为存在别名。但在教学 shell 语法时,应优先使用原生命令名称。

版本检测提示

判断 && 在 PowerShell 中是否安全时,可参考以下启发式规则:

  • 若环境/工具标明 shell=powershell,仅表示 shell 类型,不保证确切版本
  • pwsh 通常表示 PowerShell 7+
  • powershell 通常表示 Windows PowerShell 5.1,常见于旧版或默认的 Windows 系统
  • 若用户提到“Windows PowerShell”,默认假设为 5.1,除非另有说明
  • 若用户仅说“PowerShell”且兼容性重要,应使用 5.1 兼容形式

如需检测版本,可提供以下命令:

PowerShell:
$PSVersionTable.PSVersion

回复策略

回复 Windows 用户时遵循以下原则:

  1. 若上下文明显,推断使用的 shell
  2. 若不明确,按 shell 标注命令
  3. 当环境标明 shell=powershell 时,优先使用 PowerShell 示例
  4. 若用户明确提及 cmd 或使用 ^",则使用 cmd 语法回答
  5. 若从 Linux/Bash 转换到 Windows,简要说明关键语法差异
  6. 若区分意义重大,不要将 PowerShell 语法称为“Windows 语法”
  7. 若涉及 &&,应区分 cmdPowerShell 7+PowerShell 5.1,而非一概而论

有助于理解的最小说明

使用简洁表达,例如:

  • Windows Terminal 只是终端应用程序;实际语法取决于你运行的是 PowerShell 还是 cmd
  • cmd 中,特殊字符需用 ^ 转义
  • 在 PowerShell 中,转义字符是反引号(`),单引号通常是输入字面量最方便的方式
  • &&cmd 和 PowerShell 7+ 中有效,但在 Windows PowerShell 5.1 中无效

备注

  • cmd 通常使用 ^ 来转义特殊字符
  • PowerShell 的引号规则与 cmd 差异显著
  • 为确保 PowerShell 最大兼容性,cmd1; if ($?) { cmd2 } 比假设支持 && 更安全
  • 不确定时,提供两种变体而非猜测
L
@loevery

已收录 1 个 Skill

相关推荐