我有一个简单的问题,但我现在已经苦苦挣扎了几天才能运行一个简单的批处理脚本。我想要做的就是遍历一个列表(例如
123,456,789
)并用123
替换文件中字符串的第一次和第二次出现,以及接下来的两次用456
等等.. .
所以这个文件的内容:
xyz
foo xyz
foo xyz
xyz
xyz foo xyz
xyz foo xyz
xyz
foo xyz
foo xyz
xyz
之后看起来像这样:
xyz
123 xyz
123 xyz
xyz
xyz 456 xyz
xyz 456 xyz
xyz
789 xyz
789 xyz
xyz
我试过 chatGPT,但因为我是批处理菜鸟,我不知道我做错了什么,这就是我得到的:
@echo off
set "infile=replaceTest.sql"
set "outfile=replaceTest_out.sql"
set SEARCH=foo
set LIST=123,456,789
setlocal EnableDelayedExpansion
(
for %%i in (%LIST%) do (
set REPLACE=%%i
set /a count=0
for /f "delims=" %%A in ('"findstr /n ^^ %infile%"') do (
set "line=%%A"
set "line=!line:*:=!"
(echo !line! | findstr /i /c:%SEARCH% >nul) && (set /a count+=1)
if !count! LSS 3 (
REM set LINE=!LINE:%SEARCH%=%REPLACE%!
set "line=!line:foo=bar!"
)
echo(!line!
)
) > "%outfile%"
)
但这只能取代前两个......
和行
REM set LINE=!LINE:%SEARCH%=%REPLACE%!
只替换foo
什么都没有(这就是它在这里被注释掉的原因).
@ECHO Off
SETLOCAL enabledelayedexpansion
rem The following settings for the directories and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "filename1=%sourcedir%\q75615698.txt"
SET "outfile=%destdir%\outfile.txt"
set "SEARCH=foo"
set "LIST=123,456,789"
SET /a count=0
SET /a listindex=1
(
FOR /f "usebackqdelims=" %%e IN ("%filename1%") DO (
SET "line=%%e"
IF "%%e"=="!line:%search%=!" (ECHO %%e) ELSE (
SET /a listcount=0
FOR %%r IN (%list%) DO IF DEFINED line (
SET /a listcount+=1
IF !listcount!==!listindex! (
ECHO !line:%search%=%%r!
SET /a count+=1
IF !count!==2 SET /a count=0&SET /a listindex+=1
SET "line="
)
)
)
)
)>"%outfile%"
GOTO :EOF
rem 在应用于真实数据之前,始终对照测试目录进行验证。
请注意,如果文件名不包含空格等分隔符,则
usebackq
和%filename1%
两边的引号都可以省略。
Hmm - ChatGPT 被禁止 但我相信它实际上是由 ChatGPT 生成的 answers - 这个问题说明了原因。
抛开源文本的人工性质不谈,这种方法是值得怀疑的。
对于源代码中的每一行,
listindex
中的第list
条目,用替换回显字符串并计算1个替换。如果我们做了 2,请重置计数并选择下一个listindex
。清除 line
以便 for %%r
的操作被禁用,直到从源中读取下一行。