Вы запускаете новую командную оболочку при каждом вызове 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%
).