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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Victoreva, 3 мар 2015.

  1. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Доброго времени суток!
    У меня такая проблема - не могу назначить нужную кодировку при выводе в текстовой файл. Уже были подобные темы у вас на форуме- просто они мне не помогают или я где то недогоняю. Если объяснит кто-то лично с моим примером, то может до меня наконец дойдет. Нашел в интернете такое решение:
    Код (DOS):

    @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 . Не понимаю почему так и как это исправить?
     
    Последнее редактирование модератором: 3 мар 2015
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    В данном случае лучше перекодировать постфактум (файл целиком).
    Код (DOS):

    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)
     
  3. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Напишите пожалуйста
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Этот батник нужно сохранять в кодировке Windows-1251 (т.е. через обычный блокнот Windows):
    Код (DOS):

    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
     
     
  5. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Спасибо огромное!
     
  6. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Сейчас столкнулся с такой проблемой:
    Код (DOS):

    :: 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: ошибка записи. Не скажите в чем причина?
     
    Последнее редактирование модератором: 5 мар 2015
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Ответ зависит от того, что Вы имели в виду, когда писали:
    Код (Text):
    findstr /i /v """
    ?
    ++ Старайтесь, где есть возможность не использовать findstr (в ней много багов). Используйте find.
     
  8. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    На самом деле эту строчку полностью я взял из статьи в журнале. Вообще эта команда осуществляет поиск всех уязвимых сервисов(который не использует кавычки в пути к своему бинарнику)
     
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Уязвимых на предмет чего? Можно взглянуть на статью?

    В скрипте есть ошибка. А на счет кавычки, он ее немного необычно интерпретирует. Нужно отложенное раскрытие.
    Можно сделать примерно так:
    Код (DOS):

    @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
     
    Инфу перекодировал другим способ чисто из-за того, что мне так захотелось :)
     
  10. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Dragokas, вот ссылка. Подраздел магия кавычек
    --- Объединённое сообщение, 6 мар 2015 ---
    Насчет вашего способа - попробую позже, отпишусь
     
    Dragokas нравится это.
  11. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Я уже ответил:
    Даже... ошибки.

    Если ответить прямо на Ваш вопрос:
    Для findstr Вы подаете нечетное кол-во кавычек.
    Естественно синтаксический анализатор ищет для последней кавычки пару, воспринимая перенаправление вывода в файл как еще один аргумент для этой команды.
    Чтобы не быть голословным:
    example.png
    ++
    c:\windows\\
    Лишний слеш.
    Я уже написал Вам как правильно. Вы же опять используете старый вариант.
    --- Объединённое сообщение, 9 мар 2015, Дата первоначального сообщения: 9 мар 2015 ---
    так и есть.
    Код (DOS):
    @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
     
    Последнее редактирование: 9 мар 2015
    ScriptMakeR нравится это.
  13. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Для вывода в текст я использовал Ваш скрипт. Старый вариант я бы при всем желании не смог использовать, так как он вообще выдает ошибку. Он подходит только для использования в самой командной строке.
    --- Объединённое сообщение, 9 мар 2015, Дата первоначального сообщения: 9 мар 2015 ---
    А как добавить сообщение в файл, н\р "ничего не найдено", если файл после исполнения команды пустой? И аналогичный вопрос для командной строки.
     
    Последнее редактирование: 9 мар 2015
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Я про командную строку и говорил. Как уже написал там тоже ошибка.
    Код (Text):
    for /f %%a in ("%result%") do if "%%~za"=="0" echo Nothing was found>"%result%"
    Для командной строки будет так же много букАв.
     
  15. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Значит будет ошибка при других условиях.
    Я уже писал при каких:
    Это не мой скрипт. Если нужно в одну строку, используйте:
    Код (Text):
    wmic service get name,displayname,pathname,startmode|find /i "auto"|find /i /v "%SystemRoot%"|findstr /i /v """
    Но вывод в файл Вы таким образом сделать не сможете.
    Если хотите вывод в файл и все одной строкой через командную строку, можете воспользоваться таким вариантом:
    Код (Text):
    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
     
    Victoreva и Kиpилл нравится это.

Поделиться этой страницей