利用批处理脚本优化资源文件管理

在软件开发过程中,经常会遇到资源文件(如Resources.resx)中包含许多未被使用的项目。这种情况通常是因为开发者在移除使用资源的代码时,忘记了同时移除资源文件本身。解决这个问题的方法有很多,比如使用商业代码重构工具,或者对Resources.Designer.vb/.cs文件进行小修改,并依赖编译器生成未使用资源的警告。本文将介绍一种不同的方法:使用批处理脚本。

批处理脚本概述

尽管许多人可能认为批处理脚本是过时的技术,因为有Windows PowerShell、Perl或VBS文件等许多替代方案,但有时仍然使用它,因为它简单而强大。下面是一个批处理脚本的示例,用于搜索资源文件

FOR /F "tokens=*" %%a IN (%TMPFILE%) DO ( ... FINDSTR /S /P /N /C:"My.Resources.%%c" %SRCPATH% >> %OUT_ALLTOKENS% ... )

这个脚本使用FOR /F扩展语法来解析资源文件,并使用FINDSTR来查找所有资源的引用。它仅适用于VB.NET源代码文件,其中大多数开发者通常使用My.Resources.XXXX来访问资源。由于FINDSTR仅执行字符串搜索,因此批处理脚本不会关心被注释掉的代码,也不会关心不使用VB的My命名空间访问的资源。如果想将其用于C#源代码,需要编辑FINDSTR的调用,以匹配资源访问方式,例如Project1.Resources.Resource1而不是My.Resources.Resource1。

批处理脚本的威力

批处理脚本虽然简单,但其功能强大。例如,下面的代码片段展示了如何生成一个随机文件名:

:GETTEMPNAME set TMPFILE=%TMP%mytempfile-%RANDOM%-%TIME:~6,5%.tmp if exist "%TMPFILE%" GOTO :GETTEMPNAME

在C#中,等效的代码可能是:

string filename = Path.GetTempFileName();

然而,批处理脚本仍然非常原始。例如,尽管Windows XP批处理脚本允许使用块语句,但不要期望一切都像现代编程语言那样工作。下面的例子会导致问题:

IF (%1) == () ( ECHO Missing first parameter: path to the VB.NET source code files (e.g. WindowsApplication1*.vb) EXIT /B 1 ) ELSE ( SET SRCPATH=%1 )

执行会在到达ECHO时终止,没有任何指示为什么。相信这会让很多人花一些时间来弄清楚原因并修复它。下面是一个有效的替代方案:

IF (%1) == () ( ECHO Missing first parameter: path to the VB.NET source code files, e.g. WindowsApplication1*.vb EXIT /B 1 ) ELSE ( SET SRCPATH=%1 )

上述示例展示了如何检查缺少的参数。这在C#或VB.NET中会更有意义,只需与一个空字符串进行比较(例如"")。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485