Странный вывод из пакетного скрипта - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь записать вывод команды tree со многих удаленных ПК.

Вот мой сценарий

set myFile=multiPsexecList.txt

pushd %~dp0

mkdir RESULTS

for /F "tokens=*" %%i in (%myFile%) do (call :process %%i)
popd
goto :EOF

:process
 set thecomputer=%1
 echo %thecomputer%
 ping -n 1 %thecomputer% | find "TTL=" >nul 
 if errorlevel 1 ( 
     echo offline > RESULTS\OFFLINE_%thecomputer%.log
 ) else (
     net use t: \\%thecomputer%\c$
     tree t:\directory > RESULTS\%thecomputer%.log
     net use t: /delete
 )

Проблема в том, что я получаю странный вывод, как вы можете видеть ниже:

³   ÃÄÄÄDbTransactions
³   ³   ÃÄÄÄ2018-08-07
³   ³   ÃÄÄÄ2018-08-08
³   ³   ÃÄÄÄ2018-08-09
³   ³   ÃÄÄÄ2018-08-10
³   ³   ÃÄÄÄ2018-08-11
³   ³   ÃÄÄÄ2018-08-16
³   ³   ÃÄÄÄ2018-08-17
³   ³   ÃÄÄÄ2018-08-18
³   ³   ÃÄÄÄ2018-08-21
³   ³   ÃÄÄÄ2018-08-22
³   ³   ÃÄÄÄ2018-08-23
³   ³   ÃÄÄÄ2018-08-24
³   ³   ÃÄÄÄ2018-08-25
³   ³   ÃÄÄÄ2018-08-28
³   ³   ÃÄÄÄ2018-08-29

Что частично верно, за исключением этих «ÄÄÄÄ».

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 02 ноября 2018

Вывод абсолютно правильный, потому что это:

│   ├───DbTransactions
│   │   ├───2018-08-07
│   │   ├───2018-08-08
│   │   ├───2018-08-09
│   │   ├───2018-08-10
│   │   ├───2018-08-11
│   │   ├───2018-08-16
│   │   ├───2018-08-17
│   │   ├───2018-08-18
│   │   ├───2018-08-21
│   │   ├───2018-08-22
│   │   ├───2018-08-23
│   │   ├───2018-08-24
│   │   ├───2018-08-25
│   │   ├───2018-08-28
│   │   ├───2018-08-29

Чего вы не знаете, так это как кодируются символы , что должен знать каждый программист.

В консольной среде кодировка символов обычно представляет собой кодировку символов OEM , что означает, что для каждого символа используется один байт. Таким образом, количество символов ограничено 2^8 = 256 символами.

Откройте окно командной строки и выполните команду chcp. Эта команда выводит кодовую страницу , устанавливаемую по умолчанию для консольных приложений, в зависимости от страны, настроенной для используемой учетной записи пользователя в настройках Windows Region and Language . Например, кодовая страница OEM 850 используется по умолчанию в странах Западной Европы и аналогичная кодовая страница OEM 437 в странах Северной Америки.

Но кодовая страница, используемая в приложениях с графическим интерфейсом, таких как Блокнот Windows, для текстовых файлов с кодировкой символов, использующей только один байт на символ, в зависимости также от настройки страны, например, Windows-1252 в Северной Америке и Западной Европе страны.

Посмотрите на наборы символов ссылочных кодовых страниц:

  • Байт с десятичным значением 179 - это символ ³ в Windows-1252 и символ в OEM 437/850.
  • Байт с десятичным значением 195 - это символ Ã в Windows-1252 и символ в OEM 437/850.
  • Байт с десятичным значением 196 - это символ Ä в Windows-1252 и символ в OEM 437/850.

Так что вывод не странный. Вы просто просматриваете текстовый файл, используя другую кодовую страницу, которая использовалась для создания текстового файла.

Команда chcp может быть использована в окне консоли с аргументом ch ange c ode p age. Но использование chcp 1252 в верхней части командного файла перед запуском tree t:\directory > RESULTS\%thecomputer%.log не поможет, поскольку в наборе символов Windows-1252 нет символов для рисования прямоугольников. По этой причине команда tree имеет параметр /A в качестве вывода в справке при запуске tree /? для использования символов ASCII вместо символов из расширенного набора символов активной кодовой страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...