2016-03-29 2 views
1

Любая идея, почему это не сработает? Я пытаюсь создать файл, который сканирует все пакетные файлы в текущем каталоге для определенной строки (123456), и если найден, перейдите к: end. Если не найден, файл должен скопировать себя в сканированный файл и продолжить сканирование следующего файла. Любые идеи и советы приветствуются! Ура!Пакет для цикла с несколькими командами

for %%f in (*.bat) do (
     set A=%%f 
     set file=%A% 
     findstr "123456" %file% 
     if %errorlevel%==0 goto end 
     copy %0 %A% 
     ) 
    :end 

Я тестировал следующий код:

SETLOCAL EnableExtensions EnableDelayedExpansion 
    for %%f in (*.bat) do (
     set A=%%~f 
     set file=%A% 
     findstr "123456" %file% 
     if %errorlevel%==0 goto end 
     copy %0 %A% 
     ) 
    :end 

и код вратаря выполнить Гото команду завершения. Результат выглядит следующим образом:

C:\Users\Epidex98\Desktop\routine>(
    set A=ir.bat 
    set file= 
     findstr "123456" 
    if 0 == 0 goto end 
    copy "C:\Users\Epidex98\Desktop\routine\ir.bat" 
    ) 
+1

Не забудьте проверить это в папке, которая содержит единственные копии других скриптов, которые вам нужны. – LinuxDisciple

ответ

3
SETLOCAL EnableExtensions EnableDelayedExpansion 
for %%f in (*.bat) do (
    set A=%%~f 
    set file=!A! 
    findstr "123456" !file! 
    if !errorlevel!==0 goto :end 
    copy %0 !A! 
    ) 
:end 

или проще

SETLOCAL EnableExtensions EnableDelayedExpansion 
for %%f in (*.bat) do (
    findstr "123456" "%%~f" 
    if !errorlevel!==0 goto :end 
    copy %0 "%%~f" 
    ) 
:end 

Однако, если вы не можете применить замедленное разложение по некоторым причинам:

SETLOCAL EnableExtensions DisableDelayedExpansion 
for %%f in (*.bat) do (
    set A=%%f 
    call :proc 
    if errorlevel 0 goto :end 
    copy %0 %%f 
    ) 
rem next command skips :proc subroutine 
goto :end 

:proc 
    set file=%A% 
    findstr "123456" %file% 
    set /A myerror=%errorlevel%-1 
exit /B %myerror% 

:end 

Ресурсы (требуемое чтение):

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