2015-10-28 1 views
0

У меня есть сценарий bactch, который я пытаюсь понять, поскольку я новичок в пакетном программировании и должен настроить этот код. но я не могу понять, что на самом деле делают подпрограммы check_utf8_bom, create_utf8bom_free_file, remove_utf8. Может кто-то помочь?new to Batch script, что именно это для цикла do

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

Я думаю, что в том числе ** tmp.bom ** (или, по крайней мере, образец его содержимого) очень нужен –

+0

Вы только показываете нам часть кода из сценария, с которого вы его скопировали. Откуда у вас его код. Укажите ссылку, где вы ее нашли. – Squashman

+0

@ user3733648, пожалуйста, уточните, что бы вы хотели изменить в этом коде, чтобы предоставить вам целенаправленное объяснение, которое, возможно, было бы намного легче понять и * использовать *. – wOxxOm

ответ

2

%1 - это первый аргумент, переданный в скрипт/:create_utf8bom_free_file подпрограмма.

type %1\tmp>%1\tmp.bom этот prints файл tmp из %1 каталога в tmp.bom файл - это должно преобразовать файл Юникода в ASCII один (probaly без изменения byte order mark)

for /f "delims=" %%G in (%1\tmp.bom) do - значит прочитать %1\tmp.bomline by line без разделения строки с разделителями ("delims="), так на каждой итерации строка будет назначена токену %%G (временная переменная, которая живет во время выполнения FOR /F).

if not defined i и set i=1 - это обходной путь для пропавшего оператора прерывания в циклах пакетных файлов. The first checks, если переменная определена, а вторая задает значение переменной. Поэтому первая строка передается в :remove_utf8_bom (здесь должны быть удалены первые два символа строки), а затем цикл for завершен.

В конце временный файл удален, а goto:eof означает, что нужно перейти к концу скрипта - то есть что-то похожее на выход.

+0

Извините, вопрос был изменен после того, как был получен ответ. – user3733648

1

Не совсем понятно, что делает скрипт, потому что вы не опубликовали процедуру remove_utf8_bom. До сих пор могу вам сказать, что цикл читает содержимое файла tmp.bom по строкам. На каждой итерации он проверяет, установлена ​​ли переменная i или нет. Если это так, текущая обработанная строка добавляется к файлу tmp. В противном случае текущая строка, а также параметр% 1 оба передаются процедуре remove_utf8_bom (чего мы не знаем), а для переменной i устанавливается значение 1.

Это - как вы уже спрашивали - что for-loop делает (без строк выше и ниже). Для получения дополнительной информации мне нужно больше кода.

EDIT:

Кстати ... без кода я бы предположить, что этот сценарий должен удалить BOM из UTF-8 закодированных текстовых файлов. Это часто необходимо, потому что если пакетный или cmd-файл хранится в UTF-8, в начале его есть спецификация, из-за чего первая строка в скрипте не будет выполнена.

Чтобы устранить эту проблему, вы должны избегать сохранения сценариев в виде UTF-8. Если вы не можете быть уверены в кодировке, вы также можете запустить скрипты с REM doesn't matter what text is here, так как эта строка будет проигнорирована. Остальная часть скрипта будет выполнена по желанию.

+0

Извините, вопрос был изменен после того, как ответ пришел. – user3733648