Запустите консольное приложение c # с типом файла .application из .BAT - PullRequest
5 голосов
/ 08 июня 2011

Я создал консольное приложение (с использованием Visual Studio 2010), которое может читать аргументы команд.

Когда я отлаживаю, я анализирую некоторые параметры теста, которые установлены в Свойства проекта-> [имя проекта] ... -> Отладка -> Аргументы командной строки:

Он читает: "имя_параметра1| parametervalue1 "" имя_параметра2 | имя_параметра2 "" имя_параметра3 | имя_параметра3 "

Я использовал следующий код для чтения параметров:

for (Int16 argumentsCount = 0; argumentsCount < args.Length; argumentsCount++)
{
    String[] parameterItem = args[argumentsCount].Split('|');
    String parameterName = parameterItem[0].ToString();
    String parameterValue = parameterItem[1].ToString();
    /*code continues*/

}

Когда я запускаю приложение в режиме отладки, оно работает просто отличнои все параметры считываются.

Затем я опубликовал приложение на сервере и убедился, что оно было установлено с правильными разрешениями (в целях демонстрации, скажем, оно находится на C: \ MyApp, а код Complied находится в MyApp..application

Затем я создал пакетный скрипт, который выполняет приложение. * .BAT содержит следующую команду:

"C:\MyApp\MyApp.application" "parametername1|parametervalue1" "parametername2|parametervalue2" "parametername3|parametervalue3"

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

Console.Write("Arguments " + args.Length.ToString());

и это показывает Аргументы: 0

Может кто-нибудь сказать мне, как написать мой пакетный скрипт для запуска приложения и разобрать мои параметры / аргументы командной строки.

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

ETA: Не важно.Ваша проблема .application вместо .exe.Посмотрите в ваших файловых ассоциациях, что происходит с .application по сравнению с .exe:

> assoc .application
.application=Application.Manifest

> ftype Application.Manifest
Application.Manifest=rundll32.exe dfshim.dll,ShOpenVerbApplication %1

> assoc .exe
.exe=exefile

> ftype exefile
exefile="%1" %*

Вы видите разницу в том, что там передается?А именно, что обычные исполняемые файлы получают аргументы командной строки (%*).Поэтому, я думаю, вам следует использовать исполняемый файл вместо исполняемого манифеста или того, чем на самом деле является .application (честно говоря, я никогда не видел его в дикой природе).


С довольно минимальной тестовой программой

class Args {
    static void Main(string[] args) {
        for (int i = 0; i < args.Length; i++) {
            System.Console.WriteLine("[{0}]=<{1}>", i, args[i]);
        }
    }
}

у меня работает нормально.Следующий пакетный файл:

@"args.exe" "parametername1|parametervalue1" "parametername2|parametervalue2" "parametername3|parametervalue3"

дает следующий вывод:

[0]=<parametername1|parametervalue1>
[1]=<parametername2|parametervalue2>
[2]=<parametername3|parametervalue3>

Так что я думаю, что-то не так в коде, который вы нам не показали.Может быть, вы на самом деле не используете аргументы командной строки в своем приложении C #, а вместо этого ссылаетесь на другой string[] там?

0 голосов
/ 08 июня 2011

Символ канала | имеет особое значение в пакетных файлах.Я бы предложил использовать другого персонажа, чтобы все было проще.В противном случае вы должны использовать Escape Character , чтобы использовать символ pipe.Вероятно, это будет выглядеть так:

"C:\MyApp\MyApp.application" "parametername1^|parametervalue1" "parametername2^|parametervalue2" "parametername3^|parametervalue3"

обратите внимание на каретку ^ перед трубой |.

...