Объявите переменную с помощью системы ("set x =");в C ++ - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в изучении C ++, и у меня большой опыт в создании командных файлов.Я нашел команду 'system ("команда");который выполняет одну команду CMD.Есть одна проблема, которая заключается в том, что мы не можем объявить переменную.

Допустим, у нас есть этот код в пакетном файле:

@echo off
set x= hi
echo %x%
pause

приведенный выше код выдаст сообщение hi ипауза.

когда я попытался переписать его на C ++, он будет выглядеть примерно так:

int main()
{
    system("set x=hi");
    system("echo %x%");
    system("pause");
    return 0;
}

, это будет только печатать% x% вместо hi.Как я могу объявить переменную и использовать ее?Я подумал, что, возможно, есть способ написать несколько команд в одной системе ("");но я не знаю как.Спасибо

Редактировать: Для тех, кому интересно, почему я хочу это сделать, я хочу преобразовать некоторые программы, которые я создал, для работы в составе программы на С ++.Я работал над пакетными файлами в течение многих лет, и я сделал много программ.Будет полезно, если я смогу реализовать их здесь.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я подумал, что, возможно, есть способ написать несколько команд в одной системе ("");но я не знаю как.

Строка, переданная в system, будет передана в базовую оболочку как одна команда.Это поведение, определяемое реализацией (и строго зависящее от системы), какое поведение будет вызывать эта строка в базовой оболочке.

В вашем конкретном случае вызова стандартной оболочки cmd в Windows невозможно воспроизвеститочное поведение вашего примера пакетного сценария с простым вызовом system.

В отличие от пакетного сценария, где каждая команда выполняется в одном и том же контексте интерпретатора, каждый из трех отдельных вызовов system из вашего второго примера каждыйсоздать новый контекст.Таким образом, к моменту выполнения второго вызова system состояние, установленное первым вызовом (т. Е. Значение переменной среды x), уже утрачено.

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

0 голосов
/ 24 мая 2018

Вы запускаете новую командную оболочку при каждом вызове system;переменные, которые вы объявляете, существуют только в этой командной оболочке.

К сожалению, я не смог выяснить, как использовать переменные в system вызовах напрямую. 1

К счастью, хотя, @ aschipfl знал ответ и опубликовал его в качестве комментария (спасибо!).Причина, по которой set a=abc && echo %a% не работает (также не при вводе в консоль), заключается в том, что %a% оценивается при анализе команды , то есть до выполнения команды set,В этот момент переменная не установлена.Вызов cmd с включенным «отложенным расширением» переключает время оценки на время выполнения ;когда встречается echo, переменная определяется и будет напечатана.

Опция для активации отложенной оценки - /V.cmd /? выводит следующее:

/ V: ON Включить отложенное расширение переменной среды с помощью!в качестве разделителя.Например, / V: ON разрешит! Var!расширить переменную var во время выполнения.Синтаксис var расширяет переменные во время ввода, что совершенно иначе, когда внутри цикла FOR.

Так что это будет работать:

#include <cstdlib>

using namespace std;

int main()
{ 
  system("cmd /V:ON /C set a=abcd ^&^& echo !a!");
  return 0;
}

Другое решение может бытьпозвольте вашей программе создать временный пакетный файл и затем выполнить этот файл одной тривиальной командой system.Стратегия перемещения сложных сценариев в файлах в целом рекомендуется для Windows, поскольку она позволяет избежать синтаксического анализа командной строки с помощью cmd, что, как известно, трудно понять правильно ( здесь - это блог Microsoft, углубляющийся в детали).

#include <cstdlib>
#include <fstream>

using namespace std;

int main()
{
  ofstream batchfile{ "tmpbatchfile.bat" };

  batchfile << "set x=abc\n";
  batchfile << "echo %x%\n";
  batchfile << "pause\n";

  system("tmpbatchfile.bat");

  return 0;
}

Обратите внимание, что вызов system возвращается до завершения команды.Это делает невозможным удаление временного файла.


1 Следует подумать, что передача строки с более чем одной командой - многострочная или && -прикованный - сделал бы трюк, но я не могу заставить его работать. Например system("echo abc && echo ****"); работает;но system("set a=abc && echo %a%"); этого не происходит (печатается литерал %a%).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...