2013-07-26 1 views
2

У меня есть приложение WinForm, которое состоит в преобразовании одного формата флага в другой формат файла.Отправить ExitCode в прикрепленный CMD из WinForm?

Я хотел добавить поддержку CLI, поэтому я работаю с CMD из WindowsForms.

Если приложение вызывается из CMD, тогда CMD подключается к APP, и GUI не отображается.

Мое приложение определяет формат файла, в котором ничего не делается.

Проблема заключается в том, например, если я запускаю эту команду Batch, то файл будет удален, потому что я не послав ERRORCODE:

MyApp.exe "File With Incorrec tFormat" && Del "File With Incorrect Format" 

PS: Оператор Batch «& &» используется для проверки если% ERRORLEVEL% от команды before - «0», чтобы продолжить с конкатенацией команд.

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

Тогда как я могу отправить ненулевые коды выхода в прикрепленный CMD, когда приложение обнаруживает неправильный формат файла?

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

Это прок:

' Parse Arguments 
Private Sub Parse_Arguments() 

    If My.Application.CommandLineArgs.Count <> 0 Then NativeMethods.AttachConsole(-1) Else Exit Sub 

    Dim File As String = My.Application.CommandLineArgs.Item(0).ToLower 

    If IO.File.Exists(File) Then 

     If Not IsRegFile(File) Then 
      Console.WriteLine("ERROR: " & "" & File & "" & " is not a valid Regedit v5.00 script.") 
      End 
     End If 

     Dim fileinfo As New IO.FileInfo(File) 

     If My.Application.CommandLineArgs.Count = 1 Then 

      Try 
       IO.File.WriteAllText(fileinfo.DirectoryName & ".\" & fileinfo.Name.Substring(0, fileinfo.Name.LastIndexOf(".")) & ".bat", Reg2Bat(File), System.Text.Encoding.Default) 
      Catch ex As Exception 
       Console.WriteLine(ex.Message) 
      End Try 

     Else 

      Try 
       IO.File.WriteAllText(My.Application.CommandLineArgs.Item(1), Reg2Bat(File), System.Text.Encoding.Default) 
      Catch ex As Exception 
       Console.WriteLine(ex.Message) 
      End Try 

     End If ' My.Application.CommandLineArgs.Count = 1 

     ' Console.WriteLine("Done!") 

    Else 

     Console.WriteLine("ERROR: " & "" & File & "" & " don't exists.") 

    End If ' IO.File.Exists 

    End 

End Sub 

UPDATE:

Другой пример более expecific того, что я пытаюсь сделать ...:

Public Class Form1 

<System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True)> _ 
Private Shared Function AttachConsole(dwProcessId As Int32) As Boolean 
End Function 

Private Shared Function SendExitCode(ByVal ExitCode As Int32) As Int32 
    ' Here will goes unknown stuff to set the attached console exitcode... 
    Console.WriteLine(String.Format("Expected ExitCode: {0}", ExitCode)) 
    Return ExitCode 
End Function 

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown 
    AttachConsole(-1) ' Attaches the console. 
    SendExitCode(2) ' Send the exitcode (2) to the attached console. 
    Application.Exit() ' ...And finally close the app. 
End Sub 

End Class 

Как Я могу это сделать?.

ответ

2

Если я правильно понял ваш вопрос, следующий код должен это сделать. Вы можете вызвать приложение GUI из командного файла, подключиться к родительской консоли (процесса CMD) и вернуть ему код выхода.

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace TestApp 
{ 
    static class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern bool AttachConsole(uint dwProcessId); 
     const uint ATTACH_PARENT_PROCESS = uint.MaxValue; 

     // The main entry point for the application. 
     [STAThread] 
     static int Main(string[] args) 
     { 
      if (args.Length < 1) 
       return 1; 

      int exitCode = 0; 
      int.TryParse(args[0], out exitCode); 
      var message = String.Format("argument: {0}", exitCode); 

      if (args.Length > 1 && args[1] == "-attach") 
       AttachConsole(ATTACH_PARENT_PROCESS); 

      Console.WriteLine(message); // do the console output 
      MessageBox.Show(message); // do the UI 

      return exitCode; 
     } 
    } 
} 

Вот тест пакетного файла:

@echo off 
TestApp.exe 1 -attach && echo success 
echo exit code: %errorlevel% 

Выход:

argument: 1 
exit code: 1 

Изменить "1" на "0" в пакетном файле, а на выходе будет:

argument: 0 
success 
exit code: 0 

Надеюсь, это поможет.

UPDATE:

В вашем обновленном коде VB, вы, вероятно, необходимо установить Environment.ExitCode перед выходом из приложения:

Private Shared Function SendExitCode(ByVal ExitCode As Int32) As Int32 
    ' Here will goes unknown stuff to set the attached console exitcode... 
    Console.WriteLine(String.Format("Expected ExitCode: {0}", ExitCode)) 

    Environment.ExitCode = ExitCode 

    Return ExitCode 
End Function 
+0

Спасибо, но я работаю над VB.NET, я пытался перевести его с помощью онлайн-переводчиков и сам, но на VB не работает, я не знаю, чего мне не хватает из вашего кода, можете ли вы мне помочь перевести его? Я опубликовал свое намерение перевода в своем UPDATE, см. его, пожалуйста. – ElektroStudios

+0

Не удалось опубликовать здесь хорошо отформатированный код, поэтому добавили его к моему ответу. – Noseratio

+1

Наконец, я использовал «Environment.Exit()» (не .exitcode), который не нужно прикреплять к консоли, спасибо за всех ... – ElektroStudios

2

Вам необходимо скомпилировать приложение в качестве консольного приложения (даже если у вас есть графический интерфейс, который вы запускаете, если не вызывается из командной строки) и либо имеет основной метод, который возвращает int, либо вызывает environment.exit (-1).

+0

Спасибо за asnwer, я попробовал это и работает, но, как Я сказал, что я нахожусь в windowsForm, если я компилирую как «консольное приложение», тогда при запуске графического интерфейса отображается отвратительный экземпляр консоли, поэтому, если вы знаете, как избежать этой консоли, чтобы не быть автоматически прикрепленным при запуске моего app from explorer, то я буду его высоко ценить ... Вот почему я не компилирую консольное приложение, я хочу, чтобы консоль отображалась только когда я запускаю свою программу с консоли, я попытался с помощью функции Freeconsole APi выпустить консоль из GUI при запуске, но ничего не делает. – ElektroStudios

 Смежные вопросы

  • Нет связанных вопросов^_^