WinUtils:适用于Windows 95的Shell驱动CLI工具
github.com/codenaked/winutils WinUtils于1996-1997年开始,作为提升我编程能力的方式。我在Windows 95的shell API中探索,发现了文件操作函数,想推出一些调用这些函数的CLI工具,而不是直接进行原始的文件I/O。这种做法的好处是实用的:因为操作是通过shell进行的,所以你从Windows Explorer获得的确认提示、进度对话框和回收站行为都可以免费使用。WinCopy WinDel WinMove WinRen 背后的shell API 对我而言,这个项目中最有趣的部分是几乎没有重担是我自己的。shell已经知道如何以用户期望的方式复制、移动、删除和重命名文件。WinUtils基本上是这些调用的一个简单CLI前端: SHFileOperation:执行复制、移动、删除和重命名的工作马,包括通过FOF_ALLOWUNDO实现回收站支持 SHFILEOPSTRUCT:配置操作、源/目标路径和标志的结构 FO_COPY / FO_DELETE / FO_MOVE / FO_RENAME:每个工具使用的操作代码 SHGetFileInfo:用于获取与Explorer显示匹配的图标和显示名称 通过SHFileOperation路由是这些工具最佳属性“撤销”的来源。windel删除的文件进入回收站,并且误触发的winmove可以像其他shell操作一样从Explorer中撤销。 使用和开关 每个工具首先接受其源/目标参数,然后是任意数量的以/开头的单字母开关。这些开关几乎直接映射到SHFileOperation标志,加上用于帮助和关于对话框的一些便利性。 wincopy <source> <target> [/a /d /h /n /r /s /u] winmove <source> <target> [/a /d /h /n /r /s /u] windel <source> [/a /d /h /n /s /u] winren <source> <target> [/a /h /r /u] 常见开关: /a:显示关于对话框 /h:打开winutils.hlp /d:包含目录(递归),而不是默认的仅文件行为(FOF_FILESONLY) /n:对所有提示回答“是”(FOF_NOCONFIRMATION) /r:在发生冲突时重命名(FOF_RENAMEONCOLLISION) /s:静默,无进度对话框(FOF_SILENT) /u:通过回收站允许撤销(FOF_ALLOWUNDO) windel省略/r,因为没有发生冲突的目标,而winren只保留适合重命名的开关:/a,/h,/r和/u。 关于这些图标 当时,即使是将自定义图标添加到可执行文件上也感觉像是一个真正的成就。实际上,我大多数是借用现有Windows图标的部分,在图标编辑器中拼凑在一起,直到每个工具都有了看起来至少算得上独特的样子。虽然不是原创艺术,但它给每个工具赋予了身份,在EXE上添加那个最终的.ico是程序感觉完成的时刻。 以及帮助文件 /h开关打开winutils.hlp,而构建该文件几乎是一个独立的副项目。在那个时代,Windows帮助不仅仅是你发货的文本文件。你必须以RTF格式编写主题,定义一个.HPJ文件中的项目,设置内容文件(.CNT),然后运行帮助编译器(HCW / HCRTF)将所有内容转化为一个单一的.HLP二进制文件。交叉引用、弹出定义和跳转在RTF内部用脚注代码标记,这意味着大部分工作发生在Word中,并遵循非常特定的约定。没有什么是宽容的。错误的脚注或不匹配的上下文字符串会默默打开错误的主题,对于这组小工具,帮助项目是整个发布过程中最麻烦的部分之一。 发布方式 那时没有应用商店,没有GitHub Releases,没有npm publish。分发意味着将EXE和帮助文件打包,撰写简短的描述,并上传到任何愿意接受它的共享软件网站:Tucows,Download.com,WinSite,ZDNet,Simtel以及一系列更小的档案。每个网站都有其自己的提交表单和实际上列出上传内容的节奏,有时是几天或几周后。反馈循环是不断检查。我拨打电话,点击每个列表,并查看下载计数器。只是一个随时间推移而增加的数字。每一次的增加都是一点微小的快乐:某个地方的某个人正在运行我的代码。 为什么现在 我在Hacker News上看到Coreutils for Windows,它让我想起了这个旧项目。我去挖掘一下,看看我是否还保留着原始文件。结果发现我确实保留了,于是我把它们推送到GitHub并写下了这些。 值得的痛苦 现在,一个大型语言模型可能在几分钟内就能重现WinUtils的所有内容。源代码、开关、帮助文件、图标,整个工具。但是这没问题。这降低了让某件事情运作的门槛。但对我来说,痛苦正是重点。阅读纸上的shell API文档,猜测标志,抗争帮助编译器,一像素一像素地手动调整图标,等待完全重建以查看是否有任何变化。都不是高效的,但每一部分都教会了我一些我至今仍在依赖的东西。 ~codenaked
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡