执行java可执行文件(.exe)时如何获取CMD的目录[重复]

Posted

技术标签:

【中文标题】执行java可执行文件(.exe)时如何获取CMD的目录[重复]【英文标题】:How to get the directory of the CMD when I execute a java executable file (.exe) [duplicate] 【发布时间】:2019-12-20 06:46:07 【问题描述】:

如何从已导出并转换为 .exe 文件的 java 文件中找到 CMD 当前所在的当前目录。

我不是在寻找当前的工作目录,因为它只会让我知道 .exe 文件的位置。

System.getProperty("user.dir") 不是我想要的。 与 new File(".") 相同

如果cmd是C:Users/User/Desktop然后我调用file.exe,我想知道C:Users/User/Desktop的路径,而不是file.exe的目录。

我通过以下方式将 Main.java 文件转换为 .exe:(使用 Eclipse) 导出为可运行的 Jar 文件 a s file.jar

Launch4j - 输出文件 = file.exe - Jar 运行时路径 = Jars/file.jar - 不包装 jar,仅启动

【问题讨论】:

这些答案只能让我知道可执行文件的位置,而不是 cmd 的执行位置。 文件 f = new File(""); System.out.println(f.getAbsolutePath()); 它仍然只获取可执行文件所在的目录,而不是 cmd 执行的目录。 查看答案here 我认为转换为 .exe 文件可能是您遇到麻烦的原因,因为它可能会更改当前目录,这就是您会得到令人惊讶结果的原因。如果您使用 java .jar 而不是 exe 文件,那么获取 cmd 目录是否会按预期工作? 【参考方案1】:

正如提到的here 你会使用:

System.getProperty("user.dir");

它将为您提供用户工作目录。

输出是:

C:\Foo> java -jar bar\baz.jar
Directory: C:\Foo

因为这对您不起作用,所以问题必须来自 Launch4J。

当您启动 Launch4j 时,Option Basic -> Change Dir 上有一个小点,将其删除,您会很高兴的。

这里是我的 Launch4J 配置供参考:

<?xml version="1.0" encoding="UTF-8"?>
<launch4jConfig>
  <dontWrapJar>false</dontWrapJar>
  <headerType>console</headerType>
  <jar>C:\Foo\bar\baz.jar</jar>
  <outfile>C:\Foo\bar\baz.exe</outfile>
  <errTitle></errTitle>
  <cmdLine></cmdLine>
  <chdir></chdir>
  <priority>normal</priority>
  <downloadUrl>http://java.com/download</downloadUrl>
  <supportUrl></supportUrl>
  <stayAlive>false</stayAlive>
  <restartOnCrash>false</restartOnCrash>
  <manifest></manifest>
  <icon></icon>
  <jre>
    <path></path>
    <bundledJre64Bit>false</bundledJre64Bit>
    <bundledJreAsFallback>false</bundledJreAsFallback>
    <minVersion>1.6</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
    <runtimeBits>64/32</runtimeBits>
  </jre>
</launch4jConfig>

另一种可能的解决方法是使用.bat 文件,例如:

java -jar bar\baz.jar

并将这个bat打包成一个exe文件。

【讨论】:

再次,这里给出的是可执行文件的目录,而不是文件执行时cmd的目录。 @Sam 也许你的 *.exe 是你问题的一部分。您可以尝试使用 jar 文件。如果你需要一个exe,不要将jar包在exe中,只需将exe用作启动器(我认为Launch4j有一个选项),你的问题可能会得到解决。 好的,会试试的,谢谢 我在不换行的情况下转换它,但是当我执行.exe文件时,我仍然得到.exe文件的目录,而不是cmd当前所在的目录 尝试调用jar而不是exe,这样我们可以缩小错误范围。【参考方案2】:

这应该有效:

import java.util.*;
import java.lang.*;

public class GetExePath

  public static void main(String args[]) 
    try
      String exePath = System.getProperty("user.dir");
      System.out.print("exe path at ="+exePath .replace("\\", "/"));
    catch (Exception e)
      System.out.println("Some Exception ="+e.getMessage());
    
  

输出:

D:\vinay_hegde\javaexample>javac GetExePath.jav

D:\vinay_hegde\javaexample>java GetExePath
exe path at = D:\vinay_hegde\javaexample

【讨论】:

对不起,但它给了我可执行文件的目录,而不是执行文件的 cmd 目录。 嗯,与我得到的不同。也许这是我创建 .exe 文件的方式

以上是关于执行java可执行文件(.exe)时如何获取CMD的目录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

指定的任务可执行文件“cmd.exe”无法运行。指定的可执行文件不是此操作系统平台的有效应用程序

java 程序如何调用cmd调用java.exe 来运行.class文件

实用工具使用Java封装可执行exe应用全过程

怎样将java源代码打包成可执行jar文件或exe文件

可执行文件如何在父 CMD 或批处理上下文中设置环境变量?

从 Java 执行 cmd.exe 命令