AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1892642
Accepted
LDAsh
LDAsh
Asked: 2025-04-18 09:55:43 +0800 CST2025-04-18 09:55:43 +0800 CST 2025-04-18 09:55:43 +0800 CST

运行BAT文件,意外发现一首晦涩难懂的中文诗歌

  • 772

偶然发现一首晦涩难懂的中文诗歌(BAT文件)

刚刚发生了一件非常奇怪的事情。我在批处理文件中运行了这段代码:

wmic timezone get caption>>tmp_ist.bak
time/date>>tmp_ist.bak

这是偶然的,时间/日期是我自己为 %TIME%>> 做的笔记,无论如何,批处理文件停止了,我查看了 .bak 文件,然后:

图片说明 (UTC+09:30) 阿德莱德
桔⁥祳瑳浥挠湡潮⁴捡散拾琠敨琠浩⁥湥整敲⹤਍湅整⁲桴⁥敮⁷楴敭›

...变得更加奇怪,这意味着:

橘⁥祳瑳絣刮起潮水⁴捡起散落的玫瑰撒下宝藏⁥琠浩⁥ṥṣṣṣṣṇṣṣṣ�

它触发了time命令并尝试输入/date,完成后(在提示中)它会说:

The system cannot accept the time entered.

措辞不太优雅。我完全不知道发生了什么!

batch-file
  • 2 2 个回答
  • 3096 Views

2 个回答

  • Voted
  1. Best Answer
    phuclv
    2025-04-18T12:00:16+08:002025-04-18T12:00:16+08:00

    问题是由于混合使用wmic始终以默认输出格式输出 UTF-16 文本

    所有 WMIC 输出都是带有 BOM 的 UTF16 Unicode 文本,使用 TYPE 或 MORE 将其转换为纯 ASCII。
    例如WMIC OS LIST BRIEF |more >> "C:\demo.txt"

    https://ss64.com/nt/wmic.html

    桔⁥祳瑳浥挠湡潮⁴捡散瑰琠敨琠浩⁥湥整敲⹤਍湅整⁲桴⁥敮⁷楴敭›使用 UTF-16 (LE) 编码时会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产生以下字节序列

    54 68 65 20 73 79 73 74 65 6D 20 63 61 6E 6E 6F 74 20 61 63 63 65 70 74 20 74 68 65 20 74 69 6D 65 20 65 6E 74 65 72 65 64 2E 0D 0A 45 6E 74 65 72 20 74 68 65 20 6E 65 77 20 74 69 6D 65 3A 20
    

    当将相同的字节序列作为 ASCII 处理时,它变成

    The system cannot accept the time entered.
    Enter the new time:
    

    这里我使用 PowerShell 来演示,结果time如下:

    PS D:\> cmd /c "time/date > time.txt" ^C
    PS D:\> Format-Hex .\time.txt
    
               Path: D:\time.txt
    
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
    00000000   54 68 65 20 73 79 73 74 65 6D 20 63 61 6E 6E 6F  The system canno
    00000010   74 20 61 63 63 65 70 74 20 74 68 65 20 74 69 6D  t accept the tim
    00000020   65 20 65 6E 74 65 72 65 64 2E 0D 0A 45 6E 74 65  e entered...Ente
    00000030   72 20 74 68 65 20 6E 65 77 20 74 69 6D 65 3A 20  r the new time:
    

    然而,输出始终是 UTF-16,这就是为什么开头wmic会有FF FEBOM 签名。当你将输出附加time到该文件时,由于编码错误,它变成了完全垃圾。

    PS D:\> cmd /c "wmic timezone get caption > wmic.txt"
    PS D:\> Format-Hex wmic.txt
    
               Path: D:\wmic.txt
    
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
    00000000   FF FE 43 00 61 00 70 00 74 00 69 00 6F 00 6E 00  .þC.a.p.t.i.o.n.
    00000010   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000020   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000030   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000040   20 00 20 00 20 00 20 00 20 00 20 00 0D 00 0A 00   . . . . . .....
    00000050   28 00 55 00 54 00 43 00 2B 00 30 00 37 00 3A 00  (.U.T.C.+.0.7.:.
    00000060   30 00 30 00 29 00 20 00 42 00 61 00 6E 00 67 00  0.0.). .B.a.n.g.
    00000070   6B 00 6F 00 6B 00 2C 00 20 00 48 00 61 00 6E 00  k.o.k.,. .H.a.n.
    00000080   6F 00 69 00 2C 00 20 00 4A 00 61 00 6B 00 61 00  o.i.,. .J.a.k.a.
    00000090   72 00 74 00 61 00 20 00 20 00 0D 00 0A 00        r.t.a. . .....
    
    PS D:\> cmd /c "time/date >> wmic.txt" ^C
    PS D:\> Format-Hex wmic.txt
    
               Path: D:\wmic.txt
    
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
    00000000   FF FE 43 00 61 00 70 00 74 00 69 00 6F 00 6E 00  .þC.a.p.t.i.o.n.
    00000010   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000020   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000030   20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
    00000040   20 00 20 00 20 00 20 00 20 00 20 00 0D 00 0A 00   . . . . . .....
    00000050   28 00 55 00 54 00 43 00 2B 00 30 00 37 00 3A 00  (.U.T.C.+.0.7.:.
    00000060   30 00 30 00 29 00 20 00 42 00 61 00 6E 00 67 00  0.0.). .B.a.n.g.
    00000070   6B 00 6F 00 6B 00 2C 00 20 00 48 00 61 00 6E 00  k.o.k.,. .H.a.n.
    00000080   6F 00 69 00 2C 00 20 00 4A 00 61 00 6B 00 61 00  o.i.,. .J.a.k.a.
    00000090   72 00 74 00 61 00 20 00 20 00 0D 00 0A 00 54 68  r.t.a. . .....Th
    000000A0   65 20 73 79 73 74 65 6D 20 63 61 6E 6E 6F 74 20  e system cannot
    000000B0   61 63 63 65 70 74 20 74 68 65 20 74 69 6D 65 20  accept the time
    000000C0   65 6E 74 65 72 65 64 2E 0D 0A 45 6E 74 65 72 20  entered...Enter
    000000D0   74 68 65 20 6E 65 77 20 74 69 6D 65 3A 20        the new time:
    

    ANSI 输出被处理为 UTF-16,导致结果类似于Bush hid the facts漏洞。在问题中,你只显示了,>>但它的初始输出可能来自wmic

    您可以使用一些技巧,例如上面提到的管道more将wmic输出转换为 ANSI

    wmic timezone get caption | more >> tmp_ist.bak
    

    无论如何,wmic 很久以前就被弃用了,应该使用新的 PowerShell cmdlet

    • 23
  2. Io-oI
    2025-04-20T09:53:54+08:002025-04-20T09:53:54+08:00

    “该问题是由于使用wmic 导致的,它总是输出 UTF-16 文本”

    事实并非如此,因为可以根据您的选择以不同的编码wmic提供输出。/format

    这不仅关乎使用wmic,还关乎在后面放置什么/format:[here]。

    不同的格式选项会导致不同的输出编码,这会影响结果的处理方式。输出方式可能会使字符串处理变得更容易或更困难,具体取决于您将它发送到哪里或如何使用它。

    简单的格式通常更易于在脚本中读取和解析,而结构化的格式可能更适合在程序中使用,即使它们需要处理 UTF-16 之类的编码。同样,这完全取决于具体场景以及你对输出的操作。


    • 亲自看看:
    @echo off
    
    >.\"tmp_ist.bak" cd /d "%~dp0"
    
    for /f usebackq^tokens^=4delims^=^<^> %%i in =;(`
         wmic timezone get caption /format:xml ^| find "VALUE"
       `);= do >.\"tmp_ist.bak" =;( echo/%%~i
            for %%G in =;(time,date);= do call echo/%%%%~G%%
        );=
    
    timeout -1 | type .\"tmp_ist.bak"
    

    • 该文件的内容如下.\"tmp_ist.bak":
    (UTC-03:00) Brasilia
    22:51:05.46
    Sat 04/19/20
    

    • 您还可以使用以下方法获得相同的输出:
    @echo off
    
    >.\"tmp_ist.bak" cd /d "%~dp0"
    
    for /f useback^tokens^=3* %%i in =;(`
        systeminfo ^| findstr /C:"Time Zone"
       `);= do >.\"tmp_ist.bak" =;( echo/%%~i %%~j
            for %%G in =;(time,date);= do call echo/%%%%~G%%
        );=
    
    timeout -1 | type .\"tmp_ist.bak"
    

    • 输出:
    (UTC-03:00) Brasilia
    23:12:46.99
    Sat 04/19/2025
    
    • 5

相关问题

  • 我需要帮助弄清楚如何让我的批处理文件停止损坏

  • Net Stop,如何在第一个服务“正在停止...”时停止第二个服务

  • 批量密码生成器

  • Windows 2016 不会运行 .bat 文件

  • 如何制作批处理脚本来备份具有唯一目标文件夹的特定文件(Windows)[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve