我正在尝试记录许多远程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
除了这些“ÃÄÄÄ”之外,部分正确。
感谢您的帮助!
答案 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。
看参考代码页的字符集:
³
,在OEM 437/850中是字符│
。Ã
,在OEM 437/850中是字符├
。Ä
,在OEM 437/850中是字符─
。所以输出并不奇怪。您只需使用用于创建文本文件的其他代码页来查看文本文件。
命令chcp
可以在控制台窗口中使用,其参数为 ch ange c ode p age。但是,在运行chcp 1252
之前在批处理文件顶部使用tree t:\directory > RESULTS\%thecomputer%.log
并没有帮助,因为Windows-1252的字符集中没有制图符。这就是为什么命令tree
在运行/A
时使用参数tree /?
作为帮助输出时使用ASCII字符而不是活动代码页扩展字符集中的字符的原因。