在软件开发过程中,经常会遇到资源文件(如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中会更有意义,只需与一个空字符串进行比较(例如"")。