2011-04-26 6 views
2

utf-8로 인코딩 된 XML 파일에서 파일/스크립트의 이름을 읽습니다. 그런 다음 VBScript로 전달됩니다. VBScript는이 전달 된 프로그램/스크립트가 인수로 제공되는 두 번째 프로그램을 시작합니다. 인수가 영어로되어 있으면 VBScript가 성공적으로 실행됩니다. VBScript에서 러시아 이름으로 파일/스크립트를 호출 할 수 없습니다.

그러나 XML에서 읽을 이름 (러시아어를 내 경우) 영어가 아닌 경우, VBScript를 해당 파일을 찾는데 실패

.

내가 Windows에서 그것을 실행하고 있습니다로 전용 "에서 cscript"를 사용하여 Java 코드에서의 VBScript를 실행하고 있습니다. 내가 VBScript를 실행하고, 명령 프롬프트에 붙여 자바 프로그램에 의해 발사 명령을 복사 할 경우

은 그러나, 일반적으로 인수 이름에도 불구하고 실행 영어 이외의 언어입니다.

그런 다음 VBScript에서 파일/스크립트 이름을 하드 코딩했습니다. VBScript를 UCS2-LE로 인코딩을 변경하고 명령 프롬프트에서 직접 실행합니다. 그것은 정상적으로 실행됩니다. VBScript에 사용 된 다른 인코딩에 대해서는 실행되지 않았습니다. 또한 영어가 아닌 텍스트는? UCS2-LE 이외의 다른 인코딩에서.

는 그럼 난 자바 UTF16-LE로 파일/스크립트 이름을 인코딩하기 위해 노력하고 VBScript를로 통과시켰다. VBScript에서 어떤 인코딩이 사용되었는지에 관계없이 실패합니다. 다시 한번 Java 프로그램의 표준 출력에 인쇄 된 명령을 복사하여 cmd에서 실행하면 실행됩니다. Java에서 인쇄 된 명령이 영어가 아닌 텍스트를 올바르게 표시합니다.

누구든지 문제를 해결할 수 있습니까? 모든 상대적인 도움을 크게 주시면 감사하겠습니다.

이것은 현재 내가하고있는 일입니다. 나는 Java로부터 VBScript에 러시아어 텍스트를 다루는 논쟁을 전달할 필요가있다.

두 가지 접근 방식을 사용하려고했습니다.

아래 코드의 첫 번째 방법은 UnicodeLittle 인코딩을 사용하여 러시아어 텍스트를 파일에 씁니다. 파일이 UCS-2LE 인코딩에 있음을 발견했습니다. 그런 다음 VBScript는 해당 파일에서 값을 읽고 스크립트가 성공적으로 실행됩니다.

두 번째 접근 방식에서는 인코딩 된 러시아어 텍스트를 스크립트에 인수로 직접 전달하려고했습니다. VbScript가 스크립트를 열 수 없다는 메시지가 나타나지 않습니다. 이것이 내가 원하는 해결책이다.

은 아래 첨부 된 자바 코드입니다.

도움을 주시면 감사하겠습니다.

public class CallProgram 
{ 
    private static String encodeType  = "UnicodeLittle"; 
private File scriptName   = new File("F:\\Trial Files\\scriptName.txt"); 

public static void main(String[] args) 
{ 
    CallProgram obj   = new CallProgram(); 
    Runtime rt   = Runtime.getRuntime(); 

    try 
    { 
     **//Approach1 - Writes text to file and calls vbscript which reads text from file and uses it as an argument to a program** 

     String sName = "D:\\CheckPoints_SCRIPTS\\Менеджер по качеству"; //Russian Text 

     byte [] encodedByte= sName.getBytes(encodeType); 

     String testCase = new String(encodedByte, encodeType); //New string containing russian text in UnicodeLittle encoding... 

     obj.writeToFile(testCase); //Writing russian string to file... 

     String mainStr = "cscript /nologo \"D:\\Program Files\\2.0.1.3\\Adapter\\bin\\scriptRunner_FileRead_Write.vbs\""; 

         Process proc1 = rt.exec(mainStr); 
     int exit  = proc1.waitFor(); 
     System.out.println("Exit Value = " + exit); 

         **//Approach 2 - Passing encoded Russian text directly to VbScript...** 
//This is not working for me... 
     String [] arrArgs = { "cscript", "/nologo", "\"D:\\Program Files\\IBM\\Rational Adapters\\2.0.1.3\\QTPAdapter\\bin\\scriptRunner.vbs\"", testcase }; 

     ProcessBuilder process  = new ProcessBuilder(arrArgs); 
        Process proc2  = process.start(); 
     proc2.waitFor(); 

       } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (InterruptedException intue) 
    { 
     intue.printStackTrace(); 
    } 
} 

    //Function to write Russian text to file using encoding UnicodeLittle... 
private void writeToFile(String testCase) 
{ 
    FileOutputStream fos = null; 
    Writer out  = null; 
    try 
    { 
     fos   = new FileOutputStream(this.scriptName); 
     out   = new OutputStreamWriter(fos, encodeType); 
      out.write(testCase); 
     out.close(); 
     fos.close(); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException ioe) 
    { 
     ioe.printStackTrace(); 
    } 
    finally 
    { 
     try 
     { 
      if (fos != null) 
      { 
       fos.close(); 
       fos = null; 
      } 

      if (out != null) 
      { 
       out.close(); 
       out = null; 
      } 
     } 
     catch(IOException ioe) 
     { 
      fos = null; 
      out = null; 
     } 
    } 
} // End of method writeToFile.... 
} 

답변

2

긴 파일 이름 대신 짧은 8.3 스타일의 파일 이름을 사용하여 유사한 문제를 해결했습니다. ShortPath 메서드를 사용하여 FileSystemObject이라는 짧은 이름을 얻었습니다. 다음은 VBScript 예제입니다 ... Java에서 비슷한 것을 시도 할 수 있습니다. 영어가 아닌 문자로 긴 파일 이름 대신 사용할 수 있습니다 예를 들어

Function GetShortPath(strLongPath) 

    Dim FSO 
    Dim objFolder 
    Dim objFile 
    Dim strShortPath 

    Set FSO = CreateObject("Scripting.FileSystemObject") 

    ' Is it a file or a folder? 
    If FSO.FolderExists(strLongPath) Then 
     ' It's a folder. 
     Set objFolder = FSO.GetFolder(strLongPath) 
     strShortPath = objFolder.ShortPath 
    ElseIf FSO.FileExists(strLongPath) Then 
     ' It's a file. 
     Set objFile = FSO.GetFile(strLongPath) 
     strShortPath = objFile.ShortPath 
    Else 
     ' File not found. 
     strShortPath = "" 
    End If 

    GetShortPath = strShortPath 

End Function 

,

Debug.Print GetShortPath("C:\öêåéèüø.çõâ") 

반환 C:\B373~1.예 : dir /x (짧은 파일 이름 표시) 및 메모장 :

C:\sandbox>dir /x 
Volume in drive C has no label. 
Volume Serial Number is BC90-DF37 

Directory of C:\sandbox 

13/01/2011 15:12 <DIR>      . 
13/01/2011 15:12 <DIR>      .. 
13/01/2011 14:52    22 NEWTEX~1.TXT New Text Document.txt 
13/01/2011 15:05     0 C7F0~1.TXT öêåéèüø.txt 
13/01/2011 15:05     0 B373~1  öêåéèüø.çõâ 
       3 File(s)    22 bytes 
       2 Dir(s) 342,158,913,536 bytes free 

C:\sandbox>notepad B373~1 
관련 문제