如果文件被编辑,我如何在bat文件中调用resgen?

问题描述 投票:0回答:1

仅当文件被编辑时,我才需要使用 resgen.exe 创建资源文件。 我找到了一种方法来做到这一点,并且我需要循环所有可用的语言。

这是我的脚本。

@echo on

echo ------------------------------
echo -- Starting a run of resgen --
echo ------------------------------

Set resourcesPath=%~1Resources\
Set configuration=%~2
Set platform=%~3

set landingPath=%~1bin\%configuration%\Resources\

echo %landingPath%

IF exist %landingPath% ( echo %landingPath% exists ) ELSE ( mkdir %landingPath% && echo %landingPath% created)

set obj[0].Resource="%landingPath%Strings.en-GB.resources"
set obj[0].Text="%resourcesPath%Strings.en-GB.txt"
set obj[1].Resource="%landingPath%Strings.ru-RU.resources"
set obj[1].Text="%resourcesPath%Strings.ru-RU.txt"
set obj[2].Resource="%landingPath%Strings.es-ES.resources"
set obj[2].Text="%resourcesPath%Strings.es-ES.txt"


FOR /L %%i IN (0 1 2) DO  (

    for %%x in ("%%obj[%%i].Text%%") do set date_of_filenameTxt=%%~tx
    for %%x in ("%%obj[%%i].Resource%%") do set date_of_filenameRes=%%~tx

    ECHO %date_of_filenameTxt:~0, 16%
    ECHO %date_of_filenameRes:~0, 16%

    IF "%date_of_filenameTxt:~0, 16%" == "%date_of_filenameRes:~0, 16%" call :same

    call :notsame

    :same
    (ECHO "No Copy for the :" %%obj[%%i].Text%% )
    call :end

    :notsame
    "%resourcesPath%resgen.exe" %%obj[%%i].Text%% %%obj[%%i].Resource%%

    :end

)

问题是从 obj[] 获取字符串,sintax 应该如何? 我发现如果我按照下面的操作,它会起作用。

call echo resource = %%obj[0].Resource%%
batch-file
1个回答
-1
投票

使用以下代码可以更轻松地完成任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
echo ------------------------------
echo -- Starting a run of resgen --
echo ------------------------------

set "resourcesPath=%~1Resources\"
set "configuration=%~2"
set "platform=%~3"

set "landingPath=%~1bin\%configuration%\Resources\"

if exist "%landingPath%" echo "%landingPath%" exists.& goto ProcessFiles
mkdir "%landingPath%"
if exist "%landingPath%" echo "%landingPath%" created.& goto ProcessFiles
echo ERROR: "%landingPath%" could not be created!& goto EndBatch

:ProcessFiles
for %%I in ("%resourcesPath%Strings.*-*.txt") do (
    set "RunResgen=1"
    for %%J in ("%landingPath%%%~nI.resources") do if "%%~tJ" == "%%~tI" set "RunResgen="
    if defined RunResgen "%resourcesPath%resgen.exe" "%%I" "%landingPath%%%~nI.resources"
)

:EndBatch
endlocal

外部 FOR 循环在目录

Resources
中搜索与通配符模式
Strings.*-*.txt
匹配的非隐藏文件。还可以使用通配符模式
Strings.*.txt
或模式
Strings.??-??.txt

对于找到的文本文件,首先定义环境变量

RunResgen
和字符串值
1
,其中该值并不重要。

接下来又执行一次FOR处理登陆

Resources
目录下的资源文件。如果该文件根本不存在,则
%%~tJ
扩展为空字符串,这意味着 IF 条件将
""
"10.11.2021 19:00"
之类的内容进行比较,因此条件不成立。如果适当的
.resources
文件存在,则将其上次修改时间与
.txt
文件的上次修改时间进行比较。如果两个文件时间戳相等,则下一个
IF
条件的环境变量 RunResgen 未定义,因为不需要为这对文本和资源文件运行
resgen.exe

第二个 IF 条件检查环境变量

RunResgen
是否存在,如果由于
.resources
文件根本不存在或与
.txt
文件的最后修改时间不同,该变量仍然存在,则可执行文件
resgen.exe
使用两个文件名执行。

请注意,文件日期/时间格式取决于所使用帐户的国家/地区设置。在我的 Windows 计算机上,日期/时间格式为

dd.MM.yyyy hh:mm
,因此,简单的字符串比较适用于这 16 个字符,加上在比较两个字符串时还考虑了两个周围的引号。

resgen.exe
必须创建
.resources
文件,并将上次修改日期/时间明确设置为
.txt
文件的上次修改日期/时间,否则此代码根本不起作用。

Windows 上通常使用存档文件属性来确定源文件自上次处理以来是否已被修改。但我认为这在这里是不可能的,因为一个

.txt
文件可用于多个配置和平台的多个
.resources
文件(无论环境变量
platform
在真正的批处理文件中使用)。

嗯,只需使用以下一行即可进一步优化主代码:

for %%I in ("%resourcesPath%Strings.*-*.txt") do for %%J in ("%landingPath%%%~nI.resources") do if not "%%~tJ" == "%%~tI" "%resourcesPath%resgen.exe" "%%I" "%landingPath%%%~nI.resources"

可执行文件

resgen.exe
在根本不存在的
.resources
文件上执行,或其上次修改日期/时间与
.txt
文件的上次修改日期/时间不同。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • mkdir /?
  • set /?
  • setlocal /?

另请参阅 使用 Windows 批处理文件的单行多个命令,了解操作符

&
的说明,以便在 ECHO 之后始终执行 GOTO

© www.soinside.com 2019 - 2024. All rights reserved.