批处理脚本的奇怪输出

时间:2018-11-02 10:06:11

标签: batch-file

我正在尝试记录许多远程PC的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 :(得分:4)

输出绝对正确,因为它是:

│   ├───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

您不知道的是每个程序员真正应该知道的characters are encoded

在控制台环境中,字符编码通常是 OEM 字符编码,这意味着每个字符使用一个字节。因此,字符数限制为2^8 = 256个字符。

打开命令提示符窗口,然后运行命令chcp。此命令输出默认为控制台应用程序设置的代码页,具体取决于在Windows 区域和语言设置中为使用的用户帐户配置的国家/地区。例如,默认情况下,在西欧国家/地区使用代码页OEM 850,在北美国家/地区使用默认代码页OEM 437

但是,在Windows记事本之类的GUI应用程序中,用于文本文件的代码页在每个字符中仅使用一个字节进行字符编码(取决于国家/地区设置),例如在北美和西欧国家/地区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字符而不是活动代码页扩展字符集中的字符的原因。