WedX - журнал о программировании и компьютерных науках

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

Я пытался использовать системную функцию для запуска команды cmd, но я не могу получить вывод команды, потому что моя Windows итальянская. это в моем cmd и получает это - вместо / я пытался использовать chcp 437 для английского cmd, но это не сработало

пример :

system("net user xxx xxxx /add");

       

команда получает:

net user xxx xxxx -add

Я просто не хочу, чтобы это работало в итальянской винде и работало на других языках на самом деле, как решить эту проблему?

28.10.2020

  • Я немного заржавел в терминале Windows и слишком ленив, чтобы запускать мою виртуальную машину Windows, чтобы проверить прямо сейчас, но действительно ли терминал Windows реализует эти очень похожие на Linux bash-подобные конвейеры команд &&? 29.10.2020
  • на самом деле это получение && Вместо // и получение / вместо этого, поэтому мой код будет точно таким же, как cgcp437 //net user xxx xxx -add, и я не буду о ваших вопросах 29.10.2020
  • Есть ли пробел между chcp и его аргументом 437, а также пробел до и после двойного амперсанда? Кроме того, если команда chcp завершится ошибкой, ваша команда net user не запустится. Подтвердите свой код. Убедитесь, что символы && закодированы в ASCII, а параметр SWITCHCHAR не установлен. 29.10.2020
  • да, это моя ошибка, исправлено, как это сделать? нет лучшего варианта для этого на С++? 29.10.2020

Ответы:


1
  • Вы никогда не должны использовать system(). Вы программируете на С++. Нет необходимости использовать system(), так как у вас есть доступ ко всему в системе :D. В конце концов, system() был написан на C.
    И есть риск для безопасности: кто-то может заменить system() или команду, которую вы пытаетесь запустить, используя system() на вашем компьютере, и сделать неприятные вещи в вашей системе.

  • вы можете изменить кодовую страницу в своем коде перед вызовом system(), используя SetConsoleOutputCP();, который находится в windows.h
    1252 — это кодовая страница на латинице, и она должна работать на итальянском языке. Также 65001 — это кодовая страница utf-8, и она также должна хорошо работать.

  • запустить вашу программу на новом терминале Windows также можно, так как это Unicode

  • передать строку в system(), а не литерал. таким образом, вы можете быть уверены, что у него есть то, что вы хотите, до звонка.

  • рекомендуется сохранять используемую кодовую страницу перед изменением и восстанавливать ее при выходе.

Пример С++

Эта программа

  • принимает массив команд
    const char* command[] =
    {
        "DIR .\\*.* /O:D",
        "NET USER /Add /?"
    };

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

Вы можете попробовать альтернативные кодовые страницы. Здесь я использовал 65001, тот, что для Юникода.

    int originalOCP = GetConsoleOutputCP();
    std::cout << "Original CodePage: " << originalOCP << "\n";
         
    SetConsoleOutputCP(65001);
    std::cout << "CodePage now is " << GetConsoleOutputCP() << "\n";
  • Команда записывается в консоль перед передачей в system()
        std::cout <<
            "\n\n\t==> command " <<
            i << " is '" <<
            command[i] << "'\n\n";

        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:\Users\toninho\source\repos\ConsoleApplication8\ConsoleApplication8

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 <<
            "\n\n\t==> command " <<
            i << " is '" <<
            command[i] << "'\n\n";

        system(command[i]);
    };

    SetConsoleOutputCP(originalOCP);
    std::cout << "CodePage now is " << GetConsoleOutputCP() << "\n";

    return 0;
}
28.10.2020
  • Вы можете написать пример, я пытался сделать, как вы сказали, но у меня не получилось, мистер @arfneto 29.10.2020
  • @Malek Я отредактировал ответ, добавив пример. Сегодня у меня есть немного времени 29.10.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]