Poema chinês obscuro encontrado acidentalmente (arquivo BAT)
Aconteceu uma coisa muito estranha. Executei isso em um arquivo em lote:
wmic timezone get caption>>tmp_ist.bak
time/date>>tmp_ist.bak
Isso foi por acidente, a hora/data era uma nota para mim por %TIME%>>, de qualquer forma o arquivo em lote parou e eu olhei no arquivo .bak e:
Legenda (UTC+09:30) Adelaide
桔祳瑳浥挠湡潮⁴捡散瑰琠敨琠浩湥整敲湅整桴敮⁷楴敭›
...ficou mais estranho, isso se traduz em:
Laranja 祳瑳絣 raspe a maré ⁴ pegue as rosas espalhadas e espalhe o tesouro 琠 Hao ṥṣṣṣṣṇṣṣṇṣ�
Ele disparou o time
comando e tentou entrar /date
, quando isso é feito (no prompt) ele diz:
The system cannot accept the time entered.
Palavras não tão bonitas. Não faço ideia do que está acontecendo aqui!!!
O problema é devido ao uso misto que
wmic
sempre gera texto UTF-16 no formato de saída padrão桔祳瑳浥挠湡潮⁴捡散瑰琠敨琠浩湥整敲湅整桴敮⁷楴敭›
éU+6854 U+2065 U+7973 U+7473 U+6D65 U+6320 U+6E61 U+6F6E U+2074 U+6361 U+6563 U+7470 U+7420 U+6568 U+7420 U+6D69 U+2065 U+6E65 U+6574 U+6572 U+2E64 U+0A0D U+6E45 U+6574 U+2072 U+6874 U+2065 U+656E U+2077 U+6974 U+656D U+203A
o que resulta na seguinte sequência de bytes quando codificado em UTF-16 (LE)e ao tratar a mesma sequência de bytes como ASCII, torna-se
Aqui, estou usando o PowerShell para demonstrar isso com mais facilidade. A saída do
time
comando é a esperada:No entanto, a saída
wmic
é sempre UTF-16, por isso aFF FE
assinatura BOM está no início. E quando você anexa atime
saída a esse arquivo, ele se torna completamente lixo devido à codificação incorreta.A saída ANSI é tratada como UTF-16, resultando em um resultado semelhante ao do bug " Bush escondeu os fatos " . Na pergunta, você apenas mostra o erro,
>>
mas provavelmente a saída inicial era dewmic
Você pode usar alguns truques, como o piping
more
mencionado acima para converterwmic
a saída para ANSIDe qualquer forma , o wmic foi descontinuado há muito tempo, os novos cmdlets do PowerShell devem ser usados em seu lugar
Isso não é realmente verdade , porque
wmic
pode dar saída em codificações diferentes dependendo da que/format
você escolher.Não se trata apenas de usar
wmic
, mas do que você coloca depois de/format:[here]
.Diferentes opções de formato levarão a diferentes codificações de saída, o que pode afetar a forma como você lida com o resultado. A forma como a saída é gerada pode facilitar ou dificultar o processamento de strings, dependendo de para onde você a envia ou de como deseja usá-la.
Formatos mais simples costumam ser mais fáceis de ler e analisar em scripts, enquanto formatos mais estruturados podem ser melhores para uso programático, mesmo que exijam lidar com coisas como UTF-16. Novamente, tudo depende do cenário e das ações que você tomar com a saída.
.\"tmp_ist.bak"
: