我有一个我试图理解的bactch脚本,因为我是批处理编程的新手并且必须自定义此代码。但我无法理解子程序check_utf8_bom,create_utf8bom_free_file,remove_utf8实际上在做什么。有人可以帮忙吗
set /p bom=<.\bom
for /f "delims=" %%G in (.\file-list.txt) do (
call:check_utf8_bom %bom% !SOURCE_FOLDER!
)
:check_utf8_bom
rem ;; Checks If There Is The UTF-8 Bom At The Beginning Of The File
set /p firstLine=<%2\tmp
if "%firstLine:~0,3%"=="%~1" call:create_utf8bom_free_file %2
goto:eof
:create_utf8bom_free_file
rem ;; Remove UTF-8 BOM From "tmp" File o Avoid Problems During Interpretation
type %1\tmp>%1\tmp.bom
for /f "delims=" %%G in (%1\tmp.bom) do (
if defined i echo.%%G>>%1\tmp
if not defined i (
call:remove_utf8_bom "%%G" %1
set i=1
)
)
del %1\tmp.bom
goto:eof
:remove_utf8_bom
rem ;; Called From create_utf8bom_free_file Function Create The File Without The BOM In The First line
set fl=%~1
echo %fl:~3,-1%%fl:~-1%>"%2\tmp"
goto:eof
有人可以帮我理解吗?
答案 0 :(得分:2)
%1
代表传递给脚本/ :create_utf8bom_free_file
子例程的第一个参数。
type %1\tmp>%1\tmp.bom
此prints文件tmp
从%1
目录到tmp.bom
文件 - 这应该将unicode文件转换为ascii文件(probaly而不更改{{3} }})
for /f "delims=" %%G in (%1\tmp.bom) do
- 表示阅读%1\tmp.bom
byte order mark而不将分界线与分隔符("delims="
)分开,因此在每次迭代时,该行都将分配给%%G
代币(FOR /F
执行期间的临时变量。)
if not defined i
和set i=1
是批处理文件循环中缺少break运算符的解决方法。 line by line如果定义了变量,则第二个为变量设置值。所以第一行传递给:remove_utf8_bom
(此处应删除该行的前两个字符)函数,然后for循环结束。
最后临时文件被删除,goto:eof
表示转到脚本的末尾 - 即类似于退出的内容。
答案 1 :(得分:1)
由于您没有发布remove_utf8_bom过程,因此脚本的功能并不十分清楚。到目前为止,我可以告诉你,循环逐行读取文件tmp.bom的内容。在每次迭代中,它检查变量i是否被设置。如果是,则将当前处理的行附加到文件tmp。否则,当前行和参数%1都将传递给过程remove_utf8_bom(我们不知道),变量i被设置为1。
这是 - 正如你所问 - for-loop的作用(没有上面和下面的行)。有关更多信息,我需要更多代码。
修改强>
顺便说一句......即使没有代码,我也认为此脚本应该从BOM编码的文本文件中删除UTF-8。这通常是需要的,因为如果批处理文件或cmd文件存储在UTF-8中,则在其开头有一个BOM,这会导致脚本中的第一行不会被执行。
要消除此问题,应避免将脚本保存为UTF-8。如果您无法确定编码,则还可以使用REM doesn't matter what text is here
启动脚本,因为此行将被忽略。脚本的其余部分将根据需要执行。