>

누구든지 다음을 실행할 수 있습니까?

public class ExecTest {
  public static void main(String[] args) {
    try {
      //Notice the multiple spaces in the argument
      String[] cmd = {"explorer.exe", "/select,\"C:\\New      Folder\\file.txt\""};
      //btw this works
      //String cmd = "explorer.exe /select,\"C:\\New Folder\\file.txt\"";
      //and surprisingly this doesn't work
      //String[] cmd = {"explorer.exe", "/select,\"C:\\New Folder\\file.txt\""};
      //Update: and (as crazy as it seems) the following also worked
      //String[] cmd = {"explorer.exe", "/select,\"C:\\New", "Folder\\file.txt\""};
      Runtime.getRuntime().exec(cmd);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

Java 6 사용하기. Vista x64에서 테스트되었습니다. 그런데 실행되는 문자열을 가져 오려면 (문자열 버전의 exec를 사용하여 가져와야 함) Vista 시작 메뉴의검색필드에서 사용하면 예상대로 실행됩니다.
어떤 도움이라도 대단히 감사하겠습니다. 나는 미쳤어 ..!

업데이트 : 내 게시물이 지적한 두 번째 이상한 일에 대한 해결책을 추가하여 두 버전의 exec가 다르게 동작합니다. 해결책은 prunge의 답변을 기반으로합니다. 다시 Thnx.

  • 답변 # 1

    좋아요, 이것은 단순히 업데이트가 아니라 답변이기도해서 하나로 정리하고 있습니다. 내가 찾은 모든 정보에 따르면 이론적으로 다음을 수행해야합니다.

    와이즈 비즈

    여러 개의 공백이 빈 문자열로 분리되었으며 exec의 배열 버전이 사용됩니다. 위의 배열을 사용하여 java.lang.ProcessImpl의 50-75 줄에서 루프를 디버깅하여 문자열을 최종적으로 구성했습니다. 결과 문자열은 다음과 같습니다.

    explorer.exe /select,"C:\NewFolder\file.txt "

    이것은 ProcessImpl의

    String[] cmd = {"explorer.exe", "/select,\"C:\New", "", "", "", "", "", "", "Folder\file.txt\""};

    의 첫 번째 인수로 전달되는 것입니다  이 명령을 제대로 실행하지 못합니다.

    그래서 모든 것이 여기서 끝나는 것 같아 ... 슬프게도.

    자바 버그를 지적 해준 Thnx 정리. 모든 사람들이 시간과 관심을 가져 주셔서 감사합니다!

  • 답변 # 2

    명령 줄이 매우 단순하지 않으면 항상 Runtime.exec (String)가 아닌 Runtime.exec (String [])를 사용하십시오.

  • 답변 # 3

    기적, 효과가 있습니다!

    이유를 묻지 말아라.하지만 인터넷에서 신경망을 잃은 연구를 한 후에 임시 배치 파일을 임시 해결책으로 포기하고 사용하기 위해/select를 추가하는 것을 잊었다. 명령에 대한 매개 변수 및 누가 생각했을지 모르겠지만 다음은 Win 7 32Bit 시스템에서 작동합니다.

    native create
    
    

    일반 솔루션 :

    자신의 게시물 (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002)에서 prunge가 언급 한 버그 데이터베이스 솔루션이 제대로 작동했습니다.

    이유 :

    분명히 문제는 실제로 명령 문자열을 실행하기 전에 java가 수행하는 일부 문자의 주석에 있습니다. 결함이있는 Java가 작동하여 모든 것을 망칠 수 없도록 명령 문자열을 토큰 화하여 직접 주석을 달아야합니다.

    수정 방법 :

    그래서 제 경우에는 다음을 수행해야했습니다 (문자열 안에 공백이 남지 않도록).

    String param = "\"C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary Internet Files\\\"";
    try {
        String[]commands = new String[]{"explorer.exe", param};
        Process child = Runtime.getRuntime().exec(commands);
    } catch (IOException e1) {
        System.out.println("...");
    }
    
    

    공백 할 때마다 기본적으로 새 문자열을 시작 했으므로 "임시 인터넷 파일"이 "임시", "인터넷", "파일"이되었습니다.

  • 답변 # 4

    String param[] = { "explorer.exe", "/select,C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary", "Internet", "Files\\"}; try { Process child = Runtime.getRuntime().exec(param); } catch (IOException e1) { System.out.println("..."); } 사용  먼저 실행 가능한지 확인

    수정 :

    new File(pathName).canExecute()
    
    

    그리고 다음과 같이 사용할 수 있습니다 : public static void runAll(String... cmd) { for(String s : cmd) { try { Runtime.getRuntime().exec(cmd); } catch(Exception e) { e.printStackTrace(); } } }

  • 답변 # 5

    자바 버그 일 수 있습니다. 만나다: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002

    호기심에서 약간의 디버깅을 했으므로 java.lang.ProcessImpl에서 문제가 발생하지 않는다고 생각합니다 (생성자 참조). 기본 Windows API를 실제로 호출해야 할 때 문자열이

    explorer.exe "/ select,"c : \ New Folder \ test.txt ""

    그래서 해결 방법에 관해서는 버그 데이터베이스 링크를 참조하십시오.

    runAll("explorer.exe", "taskmgr.exe");

  • 이전 Javascript getElementsByNamevalue가 작동하지 않습니다
  • 다음 python - 객체 및 기본 유형 할당