#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 без контекста. Я могу добавить часть обрезки к своему ответу.