none
Некоректный вывод dir в текстовый файл RRS feed

  • Вопрос

  • Заметил слудущую вещь - при выводе dir в файл , например

    dir  > 1.txt  

    если в каталоге находятся файлы с русскими названиями, то они отображаются в некоректной кодировке .... как это обойти ?
    13 сентября 2007 г. 10:07

Ответы

  • Вариантов много, есть простой


     

    Code Snippet

    @echo off
    @chcp 1251
    @dir /B /S > files.ini
    ECHO All files cached...
    @pause
    ECHO Expander appcication processing...
    Expander_0.1.2.6.exe > logs.txt
    ECHO %DATE% >> logs.txt
    ECHO %TIME% >> logs.txt
    TYPE logs.txt
    ECHO Logs.txt updated.
    @chcp 866
    ECHO Done!

     

     

    Проверил, работает

    13 сентября 2007 г. 19:29

Все ответы

  •  

    Почему в некорректной кодировке? Эта кодировка называется DOS 866

    Можно посмотреть командой chcp

    Соответственно и смотрите файл в этой кодировке.

    13 сентября 2007 г. 11:32
    Модератор
  • Ну то что это DOS 866 я догадывался, спасибо за ответ... но боюсь он мою проблему не решит
    Дело в том, что далее мой скрипт (написан на Delphi )  начинает обрабатывать этот файл  и натыкаясь на данную кодировку  - выдает ошибку. Можно ли автоматизировать выгрузку в другой кодировке ? или придется со скриптом мудрить и програмно менять кодировку файла ?

    вот мой незамысловатый батничек


    Code Snippet

    @echo off
    @dir /B /S > files.ini
    ECHO All files cached...
    @pause
    ECHO Expander appcication processing...
    Expander_0.1.2.6.exe > logs.txt
    ECHO %DATE% >> logs.txt
    ECHO %TIME% >> logs.txt
    TYPE logs.txt
    ECHO Logs.txt updated.
    ECHO Done!

    13 сентября 2007 г. 14:01
  • либо учите свой скрипт

    либо перекодируйте вывод дир с помощью утилит

    например http://ourworld.compuserve.com/homepages/PaulGor/conv30d.zip

     

    13 сентября 2007 г. 18:28
  • Можно вместо cmd-скрипта использовать wsh. Тогда файл будет записан в кодировке 1251. Вот пример скрипта:

     

    Code Snippet

    Option Explicit

     

    const ForWriting = 2

     

    Dim oFSO, oFolder, oFile, oRepFile, colFiles
    Dim strFolder, strRepFile

     

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    strFolder = "C:\Folder"
    strRepFile = "C:\filelist.txt"

     

    Set oFolder = oFSO.GetFolder(strFolder)
    Set oRepFile = oFSO.OpenTextFile(strRepFile, ForWriting, True)

    Set colFiles = oFolder.Files

     

    For Each oFile in colFiles
      oRepFile.WriteLine oFile.Name
    Next

     

     

    13 сентября 2007 г. 18:56
    Модератор
  • Вариантов много, есть простой


     

    Code Snippet

    @echo off
    @chcp 1251
    @dir /B /S > files.ini
    ECHO All files cached...
    @pause
    ECHO Expander appcication processing...
    Expander_0.1.2.6.exe > logs.txt
    ECHO %DATE% >> logs.txt
    ECHO %TIME% >> logs.txt
    TYPE logs.txt
    ECHO Logs.txt updated.
    @chcp 866
    ECHO Done!

     

     

    Проверил, работает

    13 сентября 2007 г. 19:29
  • Огромное спасибо !!! Сергей - это лучший способ решения
    14 сентября 2007 г. 11:37
  • А не проще будет для dir:

    chcp 1251 >nul | dir /b /s >file.txt

    А для любой другой комманды, не поддерживающей корректный вывод в файл:

    ::На примере с systeminfo
    @echo off
    for /f "tokens=*" %%i in ('systeminfo') do (
       call:convert
       echo %%i>>file.txt
       chcp 866 >nul
    )
    goto:eof
    :convert
    chcp 1251 >nul

    11 декабря 2007 г. 7:02
  • Проверено.

     

    Образец кода

    rem convert866_1.bat

    chcp 1251 >nul | dir /b /s >file1.txt

     

     

     

    file1.txt имеет кодировку DOS (866)

     

    Образец кода

    rem convert866_2.bat

    @chcp 1251 >nul

    @dir /b /s >file2.txt

     

     

    file2.txt имеет кодировку Windows (1251)

    11 декабря 2007 г. 9:14
  • chcp 1251 >nul | dir /b /s >file.txt
    Да, в батнике не работает... А просто из окошка работает.
    11 декабря 2007 г. 9:23