очистить заданную строку командной строки, чтобы соответствовать filepath - PullRequest
2 голосов
/ 24 августа 2010

мое приложение обрабатывает строки с помощью командной строки. Мне нужно получить строку для данного исполняемого файла, который вызывается, например:
"C:\windows\system32\notepad.exe bla.txt" => C:\windows\system32\notepad.exe "C:\windows\system32\ipconfig /all" => C:\windows\system32\ipconfig
"D:\this is my path\thisismyexe.exe -l this -p are -m my -l parameters" => D:\this is my path\thisismyexe.exe
моя текущая идея больше похожа на обходной путь:

<code>
    String path = cmdLineString;
    while (!new File(path).exists() && path.lastIndexOf(" ") != -1) {
       path = path.substring(0, path.lastIndexOf(" "));
    }
    if (new File(path).exists())
      //go on
какие-нибудь другие полезные идеи?

Ответы [ 4 ]

1 голос
/ 25 августа 2010

Я думаю, что наилучшим подходом было бы проанализировать строку, включая правильную обработку кавычек, и обрезать первый пробел (или как там указано в спецификации).Правильное поведение не так просто, как уже упоминалось в BigMac66.Но это чище, чем угадывать с FileIO.Exists(str), должно быть более безопасным (при правильной реализации) и, возможно, быстрее, потому что не требует ввода-вывода.

Небольшое доказательство концептуального кода довольно просто и коротко, и с ним можно обращатьсяслучаи, подобные этим:

"C:\Users\xod\my file.exe" /run "asdf 123" -> "C:\Users\xod\my file.exe"
C:\Users\xod\test.exe asdf -> "C:\Users\xod\test.exe"

Код:

public String GetExecutable(String cmdline) {

    var executable = new StringBuilder();
    var inquote = false;

    foreach  (var c in cmdline.ToCharArray()) {
        if (c == '\"')
            inquote = !inquote;
        else if (!inquote && c == ' ')
            break;
        else
            executable.Append(c);
    }

    return executable.ToString();
}
0 голосов
/ 24 августа 2010

Нетривиально, вы можете попытаться улучшить свой анализ, просмотрев и включив правила файловой системы; попробуйте здесь например.

0 голосов
/ 25 августа 2010

Индексирование в обратном направлении защитит вас от слишком раннего поиска существующего файла в таких случаях:

  • C: \ My
  • C: \ My File

Вы можете добавить исполняемые суффиксы при тестировании для File.exists, чтобы захватывать подобные ipconfig.exe из ipconfig.

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

public class Example
{
    public static void main(String[] args)
    {
        String[] samples = {
            "C:\\windows\\system32\\notepad.exe bla.txt",
            "C:\\WINDOWS\\system32\\ipconfig /all",
            System.getProperty("user.home") + " foo bar"
        };

        for (String s: samples) {
            File f = getFile(s, new String[]{"exe", "cmd"});
            System.out.println(f);

            // you probably don't want to do this
            Process p = null;
            try {
                p = Runtime.getRuntime().exec(f.toString());
            } catch (IOException e) {
                System.err.println("Not executable: " + f);
            } finally {
                if (p != null) {
                    p.destroy();
                }
            }
        }
    }

    public static File getFile(String cmd, String[] suffixes)
    {
        StringBuilder buffer = new StringBuilder(cmd);
        while(true) {
            File f = new File(buffer.toString());
            if (f.exists()) {
                return f;
            } else {
                for (String suffix: suffixes) {
                    f = new File(f.toString() + "." + suffix);
                    if (f.exists()) {
                        return f;
                    }
                }
            }
            int start = buffer.lastIndexOf(" ");
            if (start <= 0) {
                break;
            }
            buffer.delete(start, buffer.length());
        }
        return null;
    }

}
0 голосов
/ 24 августа 2010

Если пути не содержат пробелов (а ваши примеры не содержат), ответ прост:

String strippedPath = unstrippedPath.replaceFirst(" .*","");
//strippes everything after the first space

Однако: это не удастся для путей типа C: \ documents and settings \ yourname \и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...