#c #cmd
#c #cmd
Вопрос:
Я попытался использовать системную функцию для запуска команды cmd, но я не могу получить вывод команды, потому что моя Windows работает на итальянском языке, когда я набираю / в своей функции system() для вызова cmd, на самом деле она получает — и не получает / Я попробовал это в своем cmd и получаю это — вместо /Я попытался использовать chcp 437 для английского cmd, но это не сработало
пример :
system("net user xxx xxxx /add");
команда получает :
net user xxx xxxx -add
Я просто не хочу делать это, чтобы работать в итальянской Windows и работать на других языках на самом деле, как решить эту проблему?
Комментарии:
1. Я немного устал от терминала Windows и слишком ленив, чтобы запустить свою виртуальную машину Windows для проверки прямо сейчас — но действительно ли Windows terminal реализует эти очень похожие на Linux
amp;amp;
командные конвейеры?2. на самом деле он получает amp;amp; Вместо // и получает / вместо — так что мой код будет точно таким же, как cgcp437 // net user xxx xxx -add, и я не о ваших вопросах
3. Есть ли пробел между
chcp
и его аргументом437
, а также пробел перед и после двойного амперсанда? Кроме того, еслиchcp
команда завершится неудачно, вашаnet user
команда не будет выполнена. Проверьте свой код. Убедитесь, что amp;amp; закодированы в ASCII, а параметр SWITCHCHAR не установлен4. да, это моя ошибка, исправлена, как это сделать? нет лучшего варианта для этого на c ?
Ответ №1:
-
Вы никогда не должны использовать
system()
. Вы программируете на C . Нет необходимости использоватьsystem()
, поскольку у вас есть доступ ко всему в system : D.system()
в конце концов, он был написан на C.
И существует угроза безопасности: кто-то может заменитьsystem()
или команду, которую вы пытаетесь запустить, используяsystem()
на вашем компьютере, и сделать неприятные вещи в вашей системе. -
вы можете изменить кодовую страницу в своем коде перед вызовом
system()
usingSetConsoleOutputCP();
, которая находится в Windows.h
1252 — это латинская кодовая страница, и на итальянском языке она должна работать нормально. Также 65001 является кодовой страницей utf-8 и также должна хорошо работать -
запустить вашу программу на «новом» терминале Windows также возможно, поскольку это Юникод
-
передайте строку
system()
, а не литерал. таким образом, вы можете быть уверены, что у него есть то, что вы хотите, перед вызовом. -
рекомендуется сохранять используемую кодовую страницу перед изменением и восстанавливать ее при выходе
Пример C
Эта программа
- принимает массив команд
const char* command[] =
{
"DIR .\*.* /O:D",
"NET USER /Add /?"
};
и запускается на консоли. Команды используют косые и обратные косые черты и выводят текст, чтобы вы могли протестировать немного больше. И вы можете просто отредактировать массив и добавить новые команды для тестирования
Вы можете попробовать альтернативные кодовые страницы. Здесь я использовал 65001, тот, который предназначен для Unicode
int originalOCP = GetConsoleOutputCP();
std::cout << "Original CodePage: " << originalOCP << "n";
SetConsoleOutputCP(65001);
std::cout << "CodePage now is " << GetConsoleOutputCP() << "n";
- Команда записывается на консоли перед передачей в
system()
std::cout <<
"nnt==> command " <<
i << " is '" <<
command[i] << "'nn";
system(command[i]);
Вывод на португальском языке Windows
Original CodePage: 850
CodePage now is 65001
==> command 0 is 'DIR .*.* /O:D'
O volume na unidade C não tem nome.
O Número de Série do Volume é 7E52-1BF2
Pasta de C:UserstoninhosourcereposConsoleApplication8ConsoleApplication8
29/10/2020 10:21 168 ConsoleApplication8.vcxproj.user
29/10/2020 10:38 974 ConsoleApplication8.vcxproj.filters
29/10/2020 10:38 7.199 ConsoleApplication8.vcxproj
29/10/2020 10:59 676 a.cpp
29/10/2020 10:59 <DIR> ..
29/10/2020 10:59 <DIR> .
29/10/2020 10:59 <DIR> Debug
4 arquivo(s) 9.017 bytes
3 pasta(s) 128.838.795.264 bytes disponíveis
==> command 1 is 'NET USER /Add /?'
A sintaxe deste comando é:
NET USER
[nome de usuário [senha | *] [opções]] [/DOMAIN]
nome de usuário {senha | *} /ADD [opções] [/DOMAIN]
nome de usuário [/DELETE] [/DOMAIN]
nome de usuário [/TIMES:{horários | ALL}]
nome de usuário [/ACTIVE: {YES | NO}]
CodePage now is 850
Код
#include <iostream>
#include <windows.h>
int main(int argc, char** argv)
{
const char* command[] =
{
"DIR .\*.* /O:D",
"NET USER /Add /?"
};
int originalOCP = GetConsoleOutputCP();
std::cout << "Original CodePage: " << originalOCP << "n";
SetConsoleOutputCP(65001);
std::cout << "CodePage now is " << GetConsoleOutputCP() << "n";
for (int i = 0; i < sizeof(command) / sizeof(char*); i = 1)
{
std::cout <<
"nnt==> command " <<
i << " is '" <<
command[i] << "'nn";
system(command[i]);
};
SetConsoleOutputCP(originalOCP);
std::cout << "CodePage now is " << GetConsoleOutputCP() << "n";
return 0;
}
Комментарии:
1. Вы можете написать пример, я пытался сделать, как вы сказали, но у меня ничего не получилось, мистер @arfneto
2. @Malek Я отредактировал ответ, чтобы добавить пример. Сегодня у меня есть немного времени