批处理脚本的新功能,这个for循环的作用是什么

时间:2015-10-28 11:13:41

标签: windows batch-file

我有一个我试图理解的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    
有人可以帮我理解吗?

2 个答案:

答案 0 :(得分:2)

%1代表传递给脚本/ :create_utf8bom_free_file子例程的第一个参数。

type %1\tmp>%1\tmp.bomprints文件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 iset 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启动脚本,因为此行将被忽略。脚本的其余部分将根据需要执行。