1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
1

Результат выполнения команды SYSTEMINFO записывается в файл в неверной кодировке (Windows XP)

15.03.2015, 14:15. Показов 7822. Ответов 19
Метки нет (Все метки)

Доброго времени суток.
Возникла проблема с программой, которую пишу на Делфи. Под Windows 7 и 8.1 все работает, а на ХР нет.

Разобрался в чем проблема. У меня в коде командная строка выполняет такие команды:
Bash
1
2
chcp 1251
systeminfo > info.txt
Но в ХР все русские символы переносятся иероглифами.
Даже если просто в командной строке ХР выполнить команды выше, в файле будут иероглифы.

Причем если попробовать к примеру такую команду:
Bash
1
2
chcp 1251
help > info.txt
То русский текст отображается нормально.

В чем проблема и почему ХР не может перенести команду systeminfo в файл?

В самой командной строке команда systeminfo выполняется корректно.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2015, 14:15
Ответы с готовыми решениями:

В текстовый файл не записывается результат выполнения команды
При запуске приложения через консоль все работает c:\iperf_client\iperf.exe -c...

Вывод в правильной кодировке в файл результата выполнения команды
понимаю что как и почему. из консоли получаем текстовик в кодировке OEM 866. а нужна windows 1251...

Вывести результат выполнения команды HELP в текстовый файл так, чтобы у каждой команды был порядковый номер
Всем привет, нужна помощь! Необходимо команду help вывести в текстовый документ, чтобы у каждой...

Запись вывода результата выполнения команды ping в текстовый файл в нужной кодировке
Собственно для запоминания результата пинга в тхт использую следующюю команду: ping google.com >...

19
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 09:49 2
Цитата Сообщение от Segh Посмотреть сообщение
В самой командной строке команда systeminfo выполняется корректно.
Потому что кодовая страница ком. строки по умолчанию - 866.
А блокнот Windows работает с ANSI.
Цитата Сообщение от Segh Посмотреть сообщение
chcp 1251
Это не несет никакого влияния. SystemInfo - это внешняя утилита. Ей все равно какая сейчас кодовая страница у ком. строки.

Не по теме:


P.S. первый раз слышу, чтобы батник писали на Дельфи :D

1
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
16.03.2015, 10:16  [ТС] 3
Dragokas, так ведь на win 7 и 8.1 работает.

Я не батник пишу, у меня просто этот код в Делфи используется. Хотя дело тут не в нем, а в том, что на ХР не могу перенести в файл результат выполнения команды SystemInfo.

Это можно как-нибудь решить?
0
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 10:59 4
Лучший ответ Сообщение было отмечено Segh как решение

Решение

Хм. Видимо версии утилит отличаются наличием в Win7 проверки.

Segh, здесь в соседней теме Вашему "коллеге" уже подсказали: Как сохранить/перекодировать файл в UTF-8 из консоли?
1
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
16.03.2015, 11:03 5
Цитата Сообщение от Segh Посмотреть сообщение
Я не батник пишу, у меня просто этот код в Делфи используется. Хотя дело тут не в нем, а в том, что на ХР не могу перенести в файл результат выполнения команды SystemInfo.
Какая-то совершенно вольная манипуляция терминами. Что значит перенести? Попытаюсь догадаться, в программе на Дельфи запускается systeminfo.exe? Тогда попробовать запустить "%comspec% /c systeminfo.exe > info.txt" как там это делается на Дельфи, раскрыв переменную среды comspec.

Цитата Сообщение от Segh Посмотреть сообщение
Но в ХР все русские символы переносятся иероглифами.
На языке высокого уровня нет возможности перекодировать файл в нужную кодировку?
1
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
16.03.2015, 11:18  [ТС] 6
Цитата Сообщение от Dragokas Посмотреть сообщение
Хм. Видимо версии утилит отличаются наличием в Win7 проверки.
Походу так. И еще chcp работает в win 7. Когда без смены кодировки переносишь в файл, русские символами иероглифами становятся.

Да, как раз только что нашел такой код:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
SetLocal
::Файл с кодировкой OEM-866
set FileIn=C:\text.txt
::Результат, куда записывать WIN-1251
set FileOut=C:\text2.txt
 
chcp 866> nul
for /f "delims=" %%a in (%FileIn%) do (
  if not defined cpReady (
    chcp 1251> nul
    set CpReady=True
  )
  call :convert "%%a"  2>NUL
)
chcp 866> nul
goto :eof
 
:convert
echo.%~1>>"%FileOut%"
Работает, осталось в Делфи запихать все.

А есть кроме systeminfo в командной сроке какая-нибудь еще команда которая показывает инфу о компьютере?
Нашел еще set, но там не то, что нужно. Все говорят про какую-то MDS, но она не работает...

Очень нужно определить вюдюху и процессор. Т.к systeminfo выдает описание процессора, а не модель.

Цитата Сообщение от Smitis Посмотреть сообщение
Что значит перенести?
Перенести, значит systeminfo > info.txt.

Как-то так
0
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
16.03.2015, 11:42 7
Цитата Сообщение от Segh Посмотреть сообщение
Перенести, значит systeminfo > info.txt
Догадался. Но это называется перенаправлением вывода.
0
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 11:45 8
Segh, перекодировать файл целиком будет более надежно (866 -> 1251).

Цитата Сообщение от Segh Посмотреть сообщение
А есть кроме systeminfo в командной сроке какая-нибудь еще команда которая показывает инфу о компьютере?
Море.
Ищите в этом разделе. Такой вопрос не раз подымали.
1
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
16.03.2015, 11:46 9
Цитата Сообщение от Segh Посмотреть сообщение
А есть кроме systeminfo в командной сроке какая-нибудь еще команда которая показывает инфу о компьютере?
Имхо, выбрано не то направление. Надо не с батниками и кодировками воевать, а прямо из дельфи определять, какое оборудование установленно.
0
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 11:49 10
Чувствую, по этой теме будет незачет за использование "сторонних средств" (как тонко подметил Smitis).
0
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
16.03.2015, 14:15  [ТС] 11
Цитата Сообщение от Smitis Посмотреть сообщение
прямо из дельфи определять, какое оборудование установленно.
В делфи определяю видюху, но почему-то не пишет ее объем. Если бы мог все это определить нормально в делфи, то естественно не парился бы с кодировками

Dragokas, есть разрешение пользоваться любыми средствами и языками программирования, увы... более-менее я знаю только Делфи.

Добавлено через 2 часа 17 минут
Цитата Сообщение от Smitis Посмотреть сообщение
Догадался. Но это называется перенаправлением вывода.
А можно перенаправить этот вывод в файл, но как источник указать не команду или что-то другое, а все, что выведено на экране?

В общем, сохранить все что на экране в файл?

Раньше пробовал clip - копировать в буфер, но опять же на xp не работает...
0
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 14:24 12
Segh, Ваш предыдущий скрипт (точнее мой, скопированный Вами) так и делает.

Bash
1
echo Инфа > файл
(запись с заменой)

Bash
1
echo Инфа >> файл
(дозапись)
0
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
16.03.2015, 18:40 13
Мне кажется, что тут два пути решения проблемы.
1. Делаем всё на дельфи. Например, через WMI. Раз systeminfo получает нужную информацию, значит и в программе эту информацию можно получить.
2. Решаем через внешние утилиты. Разбираемся с разными кодировками и с отличиями утилит в разных системах. Изобретаем способы передачи данных через буфер обмена (это не решит проблемы с кодировками). Придумываем ещё много разных обходных способов, каждый раз решая очередную проблему, не решив её бросаем и придумываем новый способ с новыми проблемами.

Вот не убедите меня, что второй способ короче первого.
Но хозяин - барин. Хочется решить задачу через одно место - флаг в руки.

П.С. (В качестве шутки)
Цитата Сообщение от Segh Посмотреть сообщение
а все, что выведено на экране?
Скачать компонент для снятия скриншота экрана.
Скачать компонент распознования текста.

П.П.С.
В конце концов, разве трудно на дельфи прочитать и по косвеным признакам (ключевым фразам) определить кодировку и перекодировать в нужную?

П.П.П.С.
У меня вызов
Bash
1
cmd.exe /c "chcp 866 & systeminfo.exe >info.txt"
прекрасно сохраняет в указанной кодировке (хоть 866, хоть 1251).
Ради эксперимента дома проверю на XP.
А вот видеокарты не показывает. Так что, systeminfo может быть и не решение проблемы.
2
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
16.03.2015, 20:14  [ТС] 14
Цитата Сообщение от Smitis Посмотреть сообщение
прекрасно сохраняет в указанной кодировке (хоть 866, хоть 1251).
На win 7 и 8.1 у меня тоже все прекрасно сохраняет.

Средствами Делфи, не используя что-то стороннее все очень печально. К примеру называние видюхи определяет, а объем нет. С процом вообще беда, только некоторые характеристики, частоту, описание и т.п. Ну и конечно руки кривые и не доходит как все полностью доделать)
Уже задавал подобную тему с определением конфигурации компа в форуме по делфи.

Кроме видюхи и объема видеопамяти systeminfo еще и название процессора не показывает, а отображает только его описание.
0
Эксперт WindowsАвтор FAQ
17951 / 7588 / 889
Регистрация: 25.12.2011
Сообщений: 11,317
Записей в блоге: 17
16.03.2015, 21:04 15
Цитата Сообщение от Segh Посмотреть сообщение
название процессора не показывает
Bash
1
WMIC CPU Get Name /Value
Цитата Сообщение от Segh Посмотреть сообщение
К примеру называние видюхи определяет, а объем нет
Bash
1
WMIC Path Win32_VideoController get AdapterRAM
Только у меня почему то значение с минусом показывает.

Вот еще. Может что полезное найдете.
Считывание информации о компьютере
1
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
16.03.2015, 21:12  [ТС] 16
Dragokas, я собственно из этой темы и нашел некоторый код, который мне нужен. По Вашему совету "искать в этом разделе"
Пробовал в батнике код от Jeka_Osokin, у меня работает.
0
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
16.03.2015, 23:07 17
Дома у меня под XP systeminfo информацию по видеокарте тоже не вывела. Странно.
А кодировка да, не меняется, всегда 866.
1
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
17.03.2015, 09:20  [ТС] 18
Dragokas, не понял... командой
Bash
1
echo.%~1>>"%FileOut%"
ну или
Bash
1
echo.%~1>> 1.txt
у меня символы "%~1" записывается файл.

Или так нельзя делать?)
Я думал можно взять всю инфу, которая выведена на экран ком. строки и запихать все в файл.

Цитата Сообщение от Smitis Посмотреть сообщение
Дома у меня под XP systeminfo информацию по видеокарте тоже не вывела. Странно.
Может она и не должна выводить? А кодировка не меняется наверно из-за того, что как говорил Dragokas "SystemInfo - это внешняя утилита".
0
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 547
17.03.2015, 10:35 19
Цитата Сообщение от Segh Посмотреть сообщение
А кодировка не меняется наверно из-за того, что как говорил Dragokas "SystemInfo - это внешняя утилита".
Она и в XP и в Win7 внешняя. Под Win7 кодировка меняется, под XP нет.

Цитата Сообщение от Segh Посмотреть сообщение
Может она и не должна выводить?
Тогда зачем все эти пляски с systeminfo, если нужную информацию она не выводит?
0
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 55
17.03.2015, 14:14  [ТС] 20
Цитата Сообщение от Segh Посмотреть сообщение
у меня символы "%~1" записывается файл.
Разобрался.
Цитата Сообщение от Smitis Посмотреть сообщение
Она и в XP и в Win7 внешняя. Под Win7 кодировка меняется, под XP нет.
Я это и имел ввиду, думал по крайней мере))
Цитата Сообщение от Smitis Посмотреть сообщение
Тогда зачем все эти пляски с systeminfo, если нужную информацию она не выводит?
Она мне нужна для получения других сведений
Извращаюсь как могу

Dragokas, Smitis большое спасибо за помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2015, 14:14
Помогаю со студенческими работами здесь

Как записать результат выполнения команды telnet в файл?
Добрый день, подскажите как записать результат команды telnet <имя удаленного сервера> <порт> в...

Информация записывается или считывается из файла в неверной кодировке
Записываю в файл строку из текстбокса Key private void ключToolStripMenuItem1_Click(object sender,...

Результат парсинга представлен в неверной кодировке
Делаю парсинг. В переменную сохраняю то, что спарсил(cохраняю в UTF8). Потом из переменной вывожу...

Запись в файл в неверной кодировке
не могу понять в чём дело.. заработался уже.. в файле выводятся каракули((( а нужно записать 5...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru