编写通用.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
相关产品推荐
相关产品推荐

