Изменения кодировки при выводе в файл

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Доброго времени суток!
У меня такая проблема - не могу назначить нужную кодировку при выводе в текстовой файл. Уже были подобные темы у вас на форуме- просто они мне не помогают или я где то недогоняю. Если объяснит кто-то лично с моим примером, то может до меня наконец дойдет. Нашел в интернете такое решение:
CMD/BATCH:
@echo off
goto:start
:convert
chcp 1251 1>nul
if not %1=="" (
echo %~1>>"%~dp0systeminfo.txt"
) else (
echo.>>"%~dp0systeminfo.txt"
)
goto:eof
:start
chcp 866 1>nul
for /f "delims=" %%i in ('systeminfo') do call:convert "%%i"
Это работает, но лишь частично - он заканчивает запись в файл, обрываясь на строке: Тип системы: x64-based PC . Не понимаю почему так и как это исправить?
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
В данном случае лучше перекодировать постфактум (файл целиком).
CMD/BATCH:
systeminfo > sys.txt
chcp 866 >NUL
for %%? in ("") do chcp 1251 & cmd /d /a /c set /p=яю<NUL > .tmp
chcp 866 >NUL
cmd /d /u /c type sys.txt >> .tmp
chcp 1251 >NUL
cmd /d /a /c type .tmp > sys.txt
del .tmp
notepad sys.txt
Этот батник нужно сохранить в кодировке OEM-866.
(если нужно, могу написать вариант и с win-1251)
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Напишите пожалуйста
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Этот батник нужно сохранять в кодировке Windows-1251 (т.е. через обычный блокнот Windows):
CMD/BATCH:
systeminfo > sys.txt
chcp 1251 >NUL
cmd /d /a /c set /p=яю<NUL > .tmp
chcp 866 >NUL
cmd /d /u /c type sys.txt >> .tmp
chcp 1251 >NUL
cmd /d /a /c type .tmp > sys.txt
del .tmp
notepad sys.txt
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Спасибо огромное!
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Сейчас столкнулся с такой проблемой:
CMD/BATCH:
:: wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """ > kavuchki.txt
chcp 1251 >NUL
cmd /d /a /c set /p=яю<NUL > .tmp
chcp 866 >NUL
cmd /d /u /c type kavuchki.txt >> .tmp
chcp 1251 >NUL
cmd /d /a /c type .tmp > kavuchki.txt
del .tmp
chcp 866 >NUL
Команда, которая в комментах выполняется без ошибок, а когда пытаюсь инфу в текст залить пишет FINDSTR: ошибка записи. Не скажите в чем причина?
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Ответ зависит от того, что Вы имели в виду, когда писали:
Код:
findstr /i /v """
?
++ Старайтесь, где есть возможность не использовать findstr (в ней много багов). Используйте find.
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
На самом деле эту строчку полностью я взял из статьи в журнале. Вообще эта команда осуществляет поиск всех уязвимых сервисов(который не использует кавычки в пути к своему бинарнику)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
я взял из статьи в журнале.
Уязвимых на предмет чего? Можно взглянуть на статью?

В скрипте есть ошибка. А на счет кавычки, он ее немного необычно интерпретирует. Нужно отложенное раскрытие.
Можно сделать примерно так:
CMD/BATCH:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set "qt=""
set result=Vulnerability.txt
del "%result%" 2>NUL
chcp 866> nul
set CpReady=
for /f "UsebackQ delims=" %%a in (`wmic service get name^,displayname^,pathname^,startmode^|find /i "auto"^|find /i /v "%SystemRoot%"^|findstr /i /v "!qt!"`) do (
  if not defined cpReady (chcp 1251 >nul& set CpReady=True)
  call :convert "%%a"
)
chcp 866> nul
pause
goto :eof

:convert
>>"%result%" cmd /c echo.%~1
Инфу перекодировал другим способ чисто из-за того, что мне так захотелось :)
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Dragokas, вот ссылка. Подраздел магия кавычек
Насчет вашего способа - попробую позже, отпишусь
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Dragokas, ну ошибки не какой не выдает. Но и файл Vulnerability.txt, тоже не создает. Или он создает файл, только если есть хотя бы одна запись? Если да, то можно сделать так, чтобы он создавал и открывал файл, даже если он пуст с н\р сообщением "нет совпадений" (и в консоль писал тоже самое).
Попробовал сделать в другой системе, там картина следующая - через командную строку появляется следующая инфа:
upload_2015-3-9_15-31-10.png
а в файл пишется:
upload_2015-3-9_15-32-18.png
Почему так?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Я уже ответил:
В скрипте есть ошибка.
Даже... ошибки.

Если ответить прямо на Ваш вопрос:
а когда пытаюсь инфу в текст залить пишет FINDSTR: ошибка записи. Не скажите в чем причина?
Для findstr Вы подаете нечетное кол-во кавычек.
Естественно синтаксический анализатор ищет для последней кавычки пару, воспринимая перенаправление вывода в файл как еще один аргумент для этой команды.
Чтобы не быть голословным:
example.png
++
c:\windows\\
Лишний слеш.
Я уже написал Вам как правильно. Вы же опять используете старый вариант.
Или он создает файл, только если есть хотя бы одна запись?
так и есть.
Если да, то можно сделать так, чтобы он создавал и открывал файл, даже если он пуст.
CMD/BATCH:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set "qt=""
set result=Vulnerability.txt
copy /y nul "%result%"
chcp 866> nul
set CpReady=
for /f "UsebackQ delims=" %%a in (`wmic service get name^,displayname^,pathname^,startmode^|find /i "auto"^|find /i /v "%SystemRoot%"^|findstr /i /v "!qt!"`) do (
  if not defined cpReady (chcp 1251 >nul& set CpReady=True)
  call :convert "%%a"
)
chcp 866> nul
notepad "%result%"
goto :eof

:convert
>>"%result%" cmd /c echo.%~1
 
Последнее редактирование:

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Для вывода в текст я использовал Ваш скрипт. Старый вариант я бы при всем желании не смог использовать, так как он вообще выдает ошибку. Он подходит только для использования в самой командной строке.
А как добавить сообщение в файл, н\р "ничего не найдено", если файл после исполнения команды пустой? И аналогичный вопрос для командной строки.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Он подходит только для использования в самой командной строке.
Я про командную строку и говорил. Как уже написал там тоже ошибка.
А как добавить сообщение в файл, н\р "ничего не найдено", если файл после исполнения команды пустой?
Код:
for /f %%a in ("%result%") do if "%%~za"=="0" echo Nothing was found>"%result%"
И аналогичный вопрос для командной строки.
Для командной строки будет так же много букАв.
 

Victoreva

Активный пользователь
Сообщения
57
Реакции
2
Баллы
88
Я про командную строку и говорил. Как уже написал там тоже ошибка.
Не понимаю какая может быть ошибка, если он показывает в точности то, что нужно.
Если использовать ваш вариант для командной строки(если я правильно конечно его понял) -
CMD/BATCH:
wmic service get name,displayname,pathname,startmode|find /i "auto"|find /i /v "%SystemRoot%"|findstr /i /v "!""!"
то там вылезает куча ненужных служб. И все равно надпись в командной строке и в файле не соответствуют друг другу.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Не понимаю какая может быть ошибка, если он показывает в точности то, что нужно.
Значит будет ошибка при других условиях.
Я уже писал при каких:
c:\windows\\
Лишний слеш.
Если использовать ваш вариант для командной строки(если я правильно конечно его понял) -
Это не мой скрипт. Если нужно в одну строку, используйте:
Код:
wmic service get name,displayname,pathname,startmode|find /i "auto"|find /i /v "%SystemRoot%"|findstr /i /v """
Но вывод в файл Вы таким образом сделать не сможете.
Если хотите вывод в файл и все одной строкой через командную строку, можете воспользоваться таким вариантом:
Код:
cmd /V:ON /c "cmd /c exit /b 34& wmic service get name,displayname,pathname,startmode|find /i "auto"|find /i /v "%SystemRoot%"|findstr /i /v "!=ExitCodeAscii!"" > 1.txt
 
Сверху Снизу