我正在编写一个CMD脚本来执行Java程序。该程序至少需要一个参数,所以我创建了一个if else块来检查参数%1
是否为空。当我在不提供参数的情况下运行脚本时,我得到了预期的you must provide an argument to run
。但是当我提供参数时,程序不会执行。另外,如果我没有设置@echo off
,那么当我提供正确的参数时,整个脚本会在窗口中打印出文本。
以下是完整的脚本:
set APP_HOME=C:\Temp\Hammer
rem Set APP_HOME to the place where you installed Hammer
if ["%1"] == [""] (
echo you must provide a python script to run
) else (
java -cp %APP_HOME%\lib\jython.jar;%APP_HOME%\lib\hammer.jar;%CLASSPATH% bridenstine.hammer.main.Main %1 %2
)
我认为这是脚本的一个问题,而不是程序本身的问题,因为当我在没有脚本的情况下自行运行else块中的行时,
java -cp C:\Temp\Hammer\lib\jython.jar;C:\Temp\Hammer\lib\hammer.jar;%CLASSPATH% bridenstine.hammer.main.Main argument1
程序正常执行。我一直在查看示例脚本并交叉引用此站点for CMD files,我所拥有的似乎是有效的。我有语法错误吗?
更新
我正在运行这样的脚本,
cd C:\Temp\Hammer
bin\ProgramScript.cmd argument1
更新2:
有人指出,当他们运行此脚本时,会收到一条错误消息,指出Java
未被识别为内部或外部命令(当他们的PATH上没有设置Java时的预期消息)但是他们做得很好指出这意味着脚本实际上进入了else块。然后我指出了以下内容,
使用有效参数运行脚本后,它会在命令提示符下将整个脚本打印为文本。然后我能够从else语句(已打印)中mark
行,复制它,粘贴它,并且它运行程序正常。所以 Java 命令似乎是有效的。但是你明确指出脚本显然已进入了else块...这里仍然存在问题,而且它似乎不是程序。
注意:
如果相关我正在使用Windows 8.1并且我使用的是标准命令提示符,而不是具有管理权限的命令提示符(无论使用具有管理权限的命令提示符,结果都保持不变)。
答案 0 :(得分:1)
我建议使用
set APP_HOME=C:\Temp\Hammer
rem Set APP_HOME to the place where you installed Hammer.
if "%~1"=="" (
echo You must provide a Python script to run.
pause
) else (
java.exe -cp "%APP_HOME%\lib\jython.jar;%APP_HOME%\lib\hammer.jar;%CLASSPATH%" bridenstine.hammer.main.Main %*
)
如果参数字符串包含像 CLASSPATH 这样的环境变量(可能包含一个或多个空格的字符串值),最好将参数字符串括在双引号中。
%*
由作为参数传递给批处理文件的所有参数扩展,即%1%2 ...
最好始终指定具有完整路径和文件扩展名的 java 等应用程序,否则Windows必须搜索文件扩展名的文件,如环境变量 PATHEXT中所定义在当前工作目录中以及在环境变量 PATH 中定义的所有目录。如果应用程序的程序文件目录不同,至少文件扩展名应该在批处理文件中。
答案 1 :(得分:0)
我只能提出一个建议;我没试过这个。
我会尝试使用插入符号;
转义每个^
:
java -cp %APP_HOME%\lib\jython.jar^;%APP_HOME%\lib\hammer.jar^;%CLASSPATH% bridenstine.hammer.main.Main %1 %2
(但我承认它抓着稻草......)
答案 2 :(得分:-2)
你在剧本的顶部想念你 -
#!/bin/bash