You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写通用.cmd脚本:实现Cmd/PowerShell向.exe传递参数

解决.cmd脚本在Cmd与PowerShell中正确传递带引号参数的问题

问题背景

有一个接收命令行参数的可执行文件(示例为Rust编写的echo_args.exe),代码如下:

use std::env;

fn main() {
    // 收集命令行参数到向量中
    let args: Vec<String> = env::args().collect();

    // 遍历参数并打印
    for arg in args.iter() {
        println!("{}", arg);
    }
}

直接调用时:

  • 在PowerShell中执行 echo_args.exe "hello ""world""",可正确输出包含hello ""world""的参数
  • 在Cmd中执行 echo_args.exe "hello """"world""""",也能得到正确结果

但使用以下简单.cmd脚本时:

@echo off
set exe=echo_args.exe
"%exe%" %*

会出现兼容性问题:

  • Cmd中调用 test "hello """"world""""" 正常工作
  • PowerShell中调用 test "hello ""world""" 时,输出变为hello "world"——cmd.exe对双引号做了去重处理,导致参数传递错误

解决方案

可以通过启用延迟扩展来保留参数中的引号,编写如下.cmd脚本:

@echo off
setlocal enabledelayedexpansion
set "exe=echo_args.exe"
"!exe!" !*!
endlocal

原理说明

  • setlocal enabledelayedexpansion 启用了延迟环境变量扩展,此时使用!*!引用所有参数时,会保留参数中的原始引号格式,避免cmd.exe默认的引号去重处理
  • 这种写法无需检测调用环境,在Cmd和PowerShell中都能正确传递包含嵌套引号的参数

内容的提问来源于stack exchange,提问作者Grismar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:06:08