Вызвать любой файл / скрипт с русским именем из VBScript не удается - PullRequest
2 голосов
/ 26 апреля 2011

Я читаю имя файла / сценария из XML-файла в кодировке utf-8. Затем он передается в VBScript. VBScript запускает вторую программу, которой эта переданная программа / скрипт предоставляется в качестве аргумента. Если аргумент указан на английском языке, сценарий VBScript выполняется успешно.

Но если имя, прочитанное из XML, не является английским (в моем случае русским), VBScript не сможет найти этот файл.

Я запускаю VBScript из кода Java только с использованием «cscript», так как я запускаю его в Windows.

Однако, если я скопирую команду, запущенную программой Java, для запуска VBScript и вставлю ее в командную строку, она выполняется нормально, несмотря на то, что имя аргумента написано не на английском языке.

Затем я жестко закодировал имя файла / скрипта в VBScript. Изменили кодировку VBScript на UCS2-LE и напрямую запустите его из командной строки. Выполнено нормально. Не удалось выполнить для любой другой кодировки, используемой для VBScript. Также неанглийский текст отображается как? в любой другой кодировке, кроме UCS2-LE.

Затем я попытался закодировать имя файла / сценария в UTF16-LE на Java, а затем передал его в VBScript. Независимо от того, какая кодировка использовалась в VBScript, она терпит неудачу. Опять же, если я скопирую команду, напечатанную на стандартном выводе, из программы Java и выполню ее из cmd, она выполнится Команда, напечатанная с Java, правильно отображает неанглийский текст.

Может кто-нибудь помочь мне решить проблему? Любая относительная помощь будет принята с благодарностью.

Это то, чем я сейчас занимаюсь. Мне нужно передать аргумент, содержащий русский текст, в VBScript из Java.

Я пытался использовать два разных подхода.

Первый подход в приведенном ниже коде записывает русский текст в файл с использованием кодировки UnicodeLittle. Обнаружен файл в кодировке UCS-2LE. Затем VBScript считывает значение из этого файла и сценарий успешно выполняется.

Во втором подходе я попытался напрямую передать закодированный русский текст в качестве аргумента скрипту. VbScript терпит неудачу, говоря, что скрипт не может быть открыт. Это подход, для которого я хочу найти решение.

Ниже приведен код Java.

Любая помощь будет принята с благодарностью.

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....
}

1 Ответ

2 голосов
/ 26 апреля 2011

Ранее я решал подобные проблемы, используя короткое имя файла в стиле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...