- 在批处理脚本中获取参数。
- 将获取到的参数传递给 Java 程序。
第一部分:批处理脚本中的参数传递 (%1, %2, ...)
在批处理脚本中,参数是通过位置来引用的,当你在命令行运行一个批处理文件时,跟在文件名后面的所有内容都会被视为参数。

%0:代表批处理脚本本身的名称。%1:代表第一个参数。%2:代表第二个参数。%9:代表第九个参数。- 代表所有参数(从
%1开始)。
如果参数数量超过9个,可以使用 shift 命令来移动参数位置,或者使用更现代的 for 循环来处理。
示例 1:简单的参数获取
创建一个名为 test_args.bat 的文件,内容如下:
@echo off echo. echo ===== 批处理脚本参数 ===== echo 脚本名称 (%0): %0 echo 第一个参数 (%1): %1 echo 第二个参数 (%2): %2 echo 第三个参数 (%3): %3 echo 所有参数 (%*): %* echo.
在命令行中运行它:
C:\> test_args.bat Hello "World of Java" 123
输出结果:

===== 批处理脚本参数 =====
脚本名称 : test_args.bat
第一个参数 : Hello
第二个参数 : World of Java
第三个参数 : 123
所有参数 : Hello "World of Java" 123
注意: 带空格的参数(如 World of Java)应该用双引号括起来,批处理会将其视为一个完整的参数。
第二部分:将批处理参数传递给 Java 程序
这是核心部分,在批处理脚本中,你只需要在调用 java 命令时,将批处理脚本的参数(%1, %2 等)直接跟在 Java 类名后面即可。
示例 2:完整的批处理调用 Java 程序
假设我们有一个简单的 Java 程序 MyApp.java,它接收并打印命令行参数。
MyApp.java

public class MyApp {
public static void main(String[] args) {
System.out.println("===== Java 程序接收到的参数 =====");
System.out.println("参数数量: " + args.length);
for (int i = 0; i < args.length; i++) {
System.out.println("参数 [" + i + "]: " + args[i]);
}
}
}
编译 Java 程序
javac MyApp.java
创建批处理脚本 run_app.bat
这个脚本的作用是调用 MyApp 类,并将自己接收到的所有参数都传递过去。
@echo off echo 正在启动 Java 程序... echo 传递的参数是: %* java MyApp %* echo Java 程序执行完毕。
运行批处理脚本
C:\> run_app.bat 用户ID "订单详情" 2025-10-27
输出结果:
正在启动 Java 程序...
传递的参数是: 用户ID "订单详情" 2025-10-27
===== Java 程序接收到的参数 =====
参数数量: 3
参数 [0]: 用户ID
参数 [1]: 订单详情
参数 [2]: 2025-10-27
Java 程序执行完毕。
从结果可以看出,run_app.bat 中的 (所有参数)被完整地传递给了 java MyApp 命令,Java 程序的 args 数组也正确接收到了这三个参数。
第三部分:处理特殊情况
传递带空格的路径
这是最常见的需求之一,批处理对带空格的参数处理良好,但你需要确保在调用 Java 时,参数本身被引号正确地包裹。
示例: 假设你的 Java 程序需要一个文件路径作为参数。
FileProcessor.java
public class FileProcessor {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println("处理文件路径: " + args[0]);
} else {
System.out.println("错误:请提供文件路径作为参数。");
}
}
}
process_file.bat
@echo off set "FILE_PATH=C:\Program Files\My App\data\input.txt" echo 准备处理文件: %FILE_PATH% java FileProcessor "%FILE_PATH%"
关键点: 在 java FileProcessor "%FILE_PATH%" 中,我们使用双引号 将变量 FILE_PATH 括起来,这确保了即使路径中包含空格,Java 程序也能将其视为一个单一的字符串参数。
传递包含特殊字符的参数
如果参数本身包含 &, , >, <, ^ 等批处理特殊字符,它们会被批处理解释器先处理,导致参数传递错误,这时需要使用 delayedexpansion 和特殊转义。
示例:
参数是 value & symbol。
SpecialCharsApp.java
public class SpecialCharsApp {
public static void main(String[] args) {
System.out.println("接收到的参数: " + args[0]);
}
}
run_special.bat
@echo off setlocal enabledelayedexpansion set "MY_PARAM=value & symbol" echo 准备传递包含特殊字符的参数: !MY_PARAM! java SpecialCharsApp "!MY_PARAM!" endlocal
关键点:
setlocal enabledelayedexpansion:启用延迟变量扩展,这样在循环或复杂逻辑中,使用!var!而不是%var%可以获取变量的最新值。!MY_PARAM!:使用感叹号来引用变量,可以避免在&符号处被错误地断开命令。- 在
java命令中,我们同样用引号将参数括起来,确保&被作为普通字符传递给 Java。
处理超过9个的参数
批处理默认只支持 %1 到 %9,如果需要传递更多参数,可以使用 shift 命令,或者更简单、更推荐的方法是使用 for 循环来遍历所有参数。
示例:使用 for 循环处理所有参数
ManyArgsApp.java
public class ManyArgsApp {
public static void main(String[] args) {
System.out.println("总参数数量: " + args.length);
for (int i = 0; i < args.length; i++) {
System.out.println("参数 " + (i + 1) + ": " + args[i]);
}
}
}
run_many.bat
@echo off echo 准备传递多个参数... java ManyArgsApp %*
这个脚本非常简洁, 会自动将批收到的所有参数(无论多少个)都传递给 Java 程序,Java 的 args 数组会接收到所有参数,无需在批处理中进行复杂处理。
总结与最佳实践
| 场景 | 批处理脚本 (run.bat) |
关键点 |
|---|---|---|
| 基本传递 | java MyProgram %1 %2 |
直接使用 %1, %2 等传递特定位置的参数。 |
| 传递所有参数 | java MyProgram %* |
最常用、最推荐。 会将所有参数作为一个整体传递,保持其原始格式。 |
| 传递带空格的路径 | java MyProgram "C:\My Path\file.txt" |
必须用双引号将参数括起来,确保它被视为一个整体。 |
| 传递包含特殊字符的参数 | setlocal enabledelayedexpansionset "param=value & symbol"java MyProgram "!param!" |
使用 delayedexpansion 和 !var! 语法来避免特殊字符被批处理误解析。 |
| 传递大量参数 (>9个) | java MyProgram %* |
for 循环或 shift 复杂,直接用 是最简单的方法。 |
核心思想:
批处理脚本充当了一个“桥梁”或“包装器”的角色,它从命令行接收参数,然后将这些原封不动地“转发”给 java 命令,理解 %1, %2, 的用法是掌握这一过程的关键,对于绝大多数情况,使用 是最简单、最可靠的选择。
