我有一个名为Test.OPT
的文本文件,其内容如下:
REPORTLOG +"E:\LicenseLogs\cstd.rl"
GROUPCASEINSENSITIVE ON
GROUP TEST_USERS user1 user2
INCLUDE feature1 TEST_USERS
INCLUDE feature2 TEST_USERS
INCLUDE Solver_feature3 TEST_USERS
INCLUDE Solver_feature4 TEST_USERS
INCLUDE Solver_feature5 TEST_USERS
INCLUDE Solver_feature6 TEST_USERS
INCLUDE Solver_feature7 TEST_USERS
我想在上述文本文件中的包含GROUP TEST_USERS
字符串User3
的行的末尾追加。
下面有一个无法按预期方式运行的批处理文件:
@echo off
setlocal EnableDelayedExpansion
set search=%1
set "textfile=D:\testing\Test.OPT"
set "newfile=D:\testing\TestTemp.OPT"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
findStr /B /c:"GROUP TEST_USERS" %%i>nul && (
set line=%%i %search%
) || (
set "line=%%i"
)
echo(!line!
endlocal
))>"%newfile%"
我可以在Java中轻松完成此操作,但是由于某些原因,我不得不使用批处理脚本来完成此操作。
答案 0 :(得分:1)
对于此任务,我建议使用以下代码:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "search=%~1"
set "textfile=D:\testing\Test.OPT"
set "newfile=D:\testing\TestTemp.OPT"
(for /F "usebackq delims=" %%i in ("%textfile%") do (
set "line=%%i"
if not "!line:GROUP TEST_USERS=!" == "!line!" (
set "UserCheck=!line! "
if "!UserCheck: %search% =!" == "!UserCheck!" set "line=!line! %search%"
)
echo(!line!
))>"%newfile%"
%SystemRoot%\System32\fc.exe /B "%textfile%" "%newfile%" >nul
if errorlevel 1 move /Y "%newfile%" "%textfile%" 2>nul
if exist "%newfile%" del "%newfile%"
endlocal
第一个 IF 条件将区分大小写的行与所有出现的GROUP TEST_USERS
替换为不区分大小写的行替换为当前行的空字符串。如果两个比较的字符串不相等,则当前行包含GROUP TEST_USERS
。
在包含GROUP TEST_USERS
的行上,该行被分配了一个尾随空格,用于环境变量UserCheck
。
第二个 IF 与第一个 IF 相似,以找出该行是否已经包含作为第一个参数传递给批处理文件的用户。该用户仅追加到尚未包含该用户的行上。
最后,对当前文件和新文件执行二进制文件比较。仅当两个文件的二进制数不相等时,新文件才移到原始文件上。否则,将删除二进制等于原始文件的新文件。因此,仅当文件内容也确实发生更改时,原始文件的最后修改日期才会更改。
请注意,此批处理代码不适用于包含空行,带有一个或多个感叹号的行或以分号开头的行的文本文件。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
del /?
echo /?
endlocal /?
fc /?
for /?
if /?
move /?
set /?
setlocal /?