2017-01-13 1 views
0

У меня есть каталог с, например, 5 текстовыми файлами.
Пакетный файл должен выполнить задачу в текстовом файле и впоследствии удалить файл.Как запускать команды в каждом текстовом файле каталога и удалять каждый текстовый файл?

Есть ли способ сделать это в цикле до тех пор, пока текстовые файлы больше не будут?

При поиске в всемирной паутине я нашел код для подсчета количества файлов в каталоге, который может быть хорошей отправной точкой.

@echo off 
set count=0 
for %%x in (*.txt) do set /a count+=1 
echo %count% 
endlocal 
Pause 

Есть ли способ включить этот код в цикл пакетного типа?

+0

Чтобы определить, остались ли файлы '.txt', вы можете использовать' if not exist '* .txt "...' вместо подсчета файлов ... – aschipfl

ответ

0

Открыть окно командной строки и запустить for /?. Вывод справки объясняет, как использовать команду ДЛЯ, чтобы что-то делать с файлами, находящимися в каталоге, или с номерами или разными строками, читаемыми откуда-то.

Вы можете использовать для простой задачи:

@echo off 
for %%I in (*.txt) do (
    echo File: "%%~fI" 
    echo del "%%~fI" 
) 
pause 

Заменить первую строку с командой ЭХО в командном блоке FOR в командной строке (ы) для использования на найденной * .txt файл имя которого удерживается переменной переменной I.

Удалите echo на второй строке в командном блоке, если командный файл работает должным образом.

Примечание: Этот командный файл просто выводит имя каждого найденного * .txt файла с полным путем и командной строкой, которые будут использоваться для удаления файла * .txt без удаления.

1

Это действительно хорошая отправная точка! Несколько вещей отметить дополнительно:

  • Вы можете выполнить более одной команды в цикле, используя синтаксис

    do (
    REM do things here 
    ) 
    
  • При использовании переменной в цикле вы установите его, вы должны использование DelayedExpansion. Взгляните на это здесь, на StackOverflow, около 5 миллионов вопросов о том, почему переменная в пакете не задана в цикле.

  • Параметр, который вы используете (%%x в вашем случае), содержит ценную информацию о файлах, если вы зацикливаете на них. Они перечислены over here.

  • В этом цикле вы не можете использовать goto, иначе он будет сломан! Сюда входят комментарии с :: (которые вы должны заменить на REM).

Для получения дополнительной информации обратитесь к SO и, например, SS64. Также обратите внимание, что вы можете получить дополнительную информацию о команде, используя либо help <commandname>, либо <commandname> /?

0

Возможно, вам понадобится решение типа while. К сожалению, нет встроенной команды windows для цикла while, но вы можете легко издеваться над ней. Цикл while - это то, что выполняет какой-то код, пока условие истинно. Чтобы оценить условие, у вас есть команда IF. Чтобы вернуться к некоторому коду (или перепрыгнуть через некоторый код), у вас есть команда и ярлыки формы :labelName (ничто не может появиться в той же строке, что и объявление метки). Чтобы перейти на ярлык, вы можете использовать goto labelName, goto :labelName или даже goto:labelName.

Ваш цикл, а может принимать 2 формы:

  1. Каждый раз, когда первая оценка состояния затем выполнить код (в то время, сделать петлю): цикл будет иметь такую ​​форму

    :loop 
    Rem commands to prepare your condition if any come here 
    <commands_prepare_condition> 
    IF NOT <condition> goto :outsideLoop 
    Rem commands to loop over come here 
    <commands_loop> 
    goto :loop 
    
    :outsideLoop 
    <command_after_loop> 
    
  2. Каждый раз сначала выполняйте код внутри цикла, а затем проверяйте условие для следующего раунда (цикл do-while):

    :loop 
    Rem commands to loop over come here 
    <commands_loop> 
    Rem commands to prepare your condition if any, come here 
    <commands_prepare_condition> 
    IF <condition> goto :loop 
    
    <commands_after_loop> 
    

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

В каждом из 2-х случаях:

  • заменить <commands_prepare_condition> с командами, которые подготовят ваше состояние. Поскольку список условий ограничен для IF, вам может понадобиться подготовить некоторые переменные или другие ранее. В вашем случае: количество файлов.

  • заменить <condition> с состояния вы хотите, чтобы быть правдой из возможностей на this page. В вашем случае это будет: %count% GTR 0. Но рассмотрим @ комментарий aschipfl и использовать EXIST "*.txt", который не нуждается в какой-либо подготовке и повернет к истине, только если какой-либо файл с расширением текстовым существует

  • поставить все команды, которые необходимо выполнить во время цикла вместо <commands_loop>

  • <commands_after_loop> - это место, где должны выполняться команды после цикла. Эта часть будет выполнена, когда цикл будет завершен.

Смежные вопросы