Как анализировать cmd.exe значения в NSI?

#c# #nsis

#c# #nsis

Вопрос:

В cmd.exe , введите Generator.exe param1 param2 param3 и скажите мне, как проанализировать полученное значение.

Generator — это исполняемый файл, созданный на C #.

Класс результата и основная часть были слегка отредактированы. Я хочу выполнить синтаксический анализ строки NSIS по результирующему значению.

 static void Main(string[] param)
{
        // ip, key, productName
        if (param.Length != 3)
        {
            CResult result = new CResult();
            result.Result = false;
            result.Msg = "IP or Key NULL";
            Console.WriteLine(result.Result.ToString()   ','   result.Msg);
            return;
        }
}
public class CResult
{
    private bool _result = false;


    public bool Result
    {
        get { return _resu< }
        set { _result = value; }
    }

    private string _msg = "WORK_FAIL";


    public string Msg
    {
        get { return _msg; }
        set { _msg = value; }
    }


    public int nRet { get; set; }
}
  

введите описание изображения здесь

Как показано на рисунке, в NSIS я хочу поместить окно сообщения в синтаксический анализ, называемое False в операторе IF.

Комментарии:

1. Если Generator.exe это программа на C #, как она связана с NSI?

2. Это как-нибудь поможет? learn.microsoft.com/en-us/dotnet/csharp/programming-guide /…

3. @Anders Я не очень хорошо говорю по-английски. Generator.exe выдает лицензию после проверки конкретного IP-адреса через WebRequest. Следовательно, он возвращает результирующее значение. Например, значение результирующего КЛАССА равно True, а лицензия выполнена успешно. Я снова отредактирую результирующий класс.

4. @ Robin Bennett Я так не думаю. Я объяснил вопрос более подробно.

5. Анализировать значение как что? Если вы не можете объяснить по-английски, продемонстрируйте на примерах, покажите ввод, покажите желаемый результат, что вы пробовали и какой результат вы сейчас получаете.

Ответ №1:

Используйте nsExec (или один из других плагинов exec), если вам нужно записать выходные данные, записанные в стандартный вывод консольной программой:

 !include LogicLib.nsh

Section
nsExec::ExecToStack '"$InstDirGenerator.exe" param1 param2 param3'
Pop $0 ; Exit code
Pop $1 ; Output
${If} $1 == "string goes here"
  MessageBox mb_Ok "Message text!"
  Abort
${EndIf}
SectionEnd
  

Если выходные данные содержат новые строки, вы можете включить их в свою проверку строк:

 Section
nsExec::ExecToStack '"cmd.exe" /c echo.Hello'
Pop $0 ; Exit code
Pop $1 ; Output

${If} $1 = "Hello$r$n"
    MessageBox mb_OK "Hi"
${EndIf}
SectionEnd
  

или вы можете удалить новые строки:

 !include StrFunc.nsh
${StrTrimNewLines}

Section
nsExec::ExecToStack '"cmd.exe" /c echo.Hello'
Pop $0 ; Exit code
Pop $1 ; Output

${StrTrimNewLines} $1 $1
${If} $1 = "Hello"
    MessageBox mb_OK "Hi"
${EndIf}
SectionEnd
  

Комментарии:

1. спасибо большое. Я попробую это завтра. У меня болит голова из-за NSIS .. Можете ли вы помочь мне с другими вопросами? Есть ли способ создать папку в корне NSIS и установить ее перед $ InstDir (перед установкой файлов)?

2. Да, вы можете создать каталог, но вам следует задать новый вопрос. И, пожалуйста, попробуйте потратить немного дополнительного времени, чтобы объяснить, что вы пытаетесь сделать и каким должен быть результат при задании вопроса.

3. Я не могу отлаживать в nsis, поэтому, думаю, я использовал trim. Спасибо за ваш ответ.

4. Небольшие советы по отладке, если вы не получаете совпадения строк, посмотрите на строку с помощью MessageBox mb_Ok "|$0|" . Он покажет вам, есть ли новые строки.

Ответ №2:

Я пытался использовать строковое значение, полученное с консоли, но у меня не получилось его использовать. Я проверил наличие пробелов и символов новой строки. Я не знаю почему. Но он обычно использовался, когда я добавлял часть обработки Trim в NSIS.

 Function Trim
Exch $R1 ; Original string
Push $R2
Loop:
    StrCpy $R2 "$R1" 1
    StrCmp "$R2" " " TrimLeft
    StrCmp "$R2" "$r" TrimLeft
    StrCmp "$R2" "$n" TrimLeft
    StrCmp "$R2" "$t" TrimLeft
    GoTo Loop2
TrimLeft:
    StrCpy $R1 "$R1" "" 1
    Goto Loop
Loop2:
    StrCpy $R2 "$R1" 1 -1
    StrCmp "$R2" " " TrimRight
    StrCmp "$R2" "$r" TrimRight
    StrCmp "$R2" "$n" TrimRight
    StrCmp "$R2" "$t" TrimRight
    GoTo Done
TrimRight:
    StrCpy $R1 "$R1" -1
    Goto Loop2
Done:
    Pop $R2
    Exch $R1
FunctionEnd
  

Комментарии:

1. На самом деле это не ответ, вы только что опубликовали функцию trim без контекста. Я могу добавить часть обрезки к своему ответу.