CMD не может правильно прочитать входные символы

#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() using SetConsoleOutputCP(); , которая находится в 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 Я отредактировал ответ, чтобы добавить пример. Сегодня у меня есть немного времени