Запустите консольное приложение С# с типом файла .application из .BAT

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

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

Он гласит: "имя параметра1|значение параметра1" "имя параметра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, а скомпилированный код находится в MyApp.application).

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

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

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

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

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

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


person Fab    schedule 08.06.2011    source источник
comment
/стандартный способ?   -  person Ritch Melton    schedule 08.06.2011


Ответы (2)


Расчетное время прибытия: Неважно. Ваша проблема .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[]?

person Joey    schedule 08.06.2011
comment
Большое спасибо, ребята. Моя проблема действительно заключалась в том, что я выполнял файл .application. Чтобы получить .exe, я просто зашел в каталог проекта bin/Debug и скопировал .exe в мой каталог развертывания. Затем я изменил свой пакетный скрипт, чтобы он выполнял .exe, и когда я снова запустил свой пакетный скрипт... Эй, вуаля, это сработало! Итак, мой пакетный сценарий в итоге выглядел так: C:\MyApp\MyApp.exe имя_параметра1|значение_параметра1 имя_параметра2|значение_параметра2 имя_параметра3|значение_параметра3 - person Fab; 09.06.2011

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

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

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

person wimh    schedule 08.06.2011
comment
Привет, спасибо, что вернулся. Я пытался использовать символ ^, но он все еще не работает. Должно быть что-то не так с моим пакетным скриптом и с тем, как я анализирую свои параметры... Я просто не могу понять. Любой? - person Fab; 08.06.2011
comment
| не проблема, так как они правильно цитируют его. Он правильно передается приложению. - person Joey; 08.06.2011