DOS批处理中cd和%dp0、以及cmd /c和cmd /k 的区别

1、项目需求

项目中有个执行端想要通过关闭awt窗体,联动关闭dos窗体

DOS批处理中cd和%dp0、以及cmd /c和cmd /k 的区别

2、bat脚本命令如下

start cmd /k "cd ./jdk1.8.0_191-32/bin && java -Dfile.encoding=utf-8 -Xmx1024m -Xms1024m -Xmn512m -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -XX:ParallelGCThreads=2 -Xloggc:C:\logs\gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\logs\java.hprof -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -jar ../../jar/ProxyRobotServer.jar"

这个脚本原来是可以正常关闭的,正常情况下的bat命令如下

start %~dp0jdk1.8.0_191-32\jre\bin\java.exe -Xmx1024m -Xms1024m -Xmn512m -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -XX:ParallelGCThreads=2 -Xloggc:C:\logs\gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\logs\java.hprof -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -jar %~dp0jar\ProxyRobotServer.jar 

这两个bat脚本经过beyond之后保留部分为


start %~dp0jdk1.8.0_191-32\jre\bin\java.exe    %~dp0jar\ProxyRobotServer-0.0.1-SNAPSHOT.jar


start cmd /k "cd ./jdk1.8.0_191-32/bin && java  ../../jar/ProxyRobotServer-0.0.1-SNAPSHOT.jar"

3、问题定位

以上保留部分有两个地方不一样就是命令和路径不同

(a)%dp0和cd命令的区别

  %dp0为当前bat所在路径的根路径,比如bat在c:\bat_lib\start.bat,那%dp0就表示c:\bat_lib路径,系统提供的一种表示

 cd呢这个偷一张图,或许下次就记忆的更加清楚了

DOS批处理中cd和%dp0、以及cmd /c和cmd /k 的区别

(b)cmd /k 和cmd /c的使用

  cmd /k 执行命令后不关闭dos窗体

  cmd /c 执行命令后 关闭dos窗体

 由于这个客户端是dos窗体打开的,可以认为是一体的,属于命令的一部分,所以关闭不关闭也适用

 

综上,dp0和cd不影响该命令窗体的关闭,那就是cmd的事情了

修改执行脚本中cmd /k为cmd /c就可以解决了