2015-12-15 3 views
-1

Я могу использовать ERRORLEVEL, но попытался, и с петлей это не удалось. Я пишу пакетную «оболочку». Поскольку я пытался и пытался, я, наконец, прошу о помощи. Причина, по которой я не хочу использовать errorlevel, - это цикл.Как найти определенное слово в файле без использования ERRORLEVEL (пакетный)

(FULL) SHELL

@set /p build=<"C:\Users\%username%\Desktop\WellOS2\WellOS\Build".txt 
@title WellOS V.%build% 
@echo off 
goto boot 
:register 
cls 
echo You are registering... 
echo If this is an error press CTRL + C NOW... 
pause 
cls 
set /p user= Enter your username: 
set /p passwordreg= Enter your password: 
mkdir "C:\Users\%username%\Desktop\WellOS2\Users\%user%" 
mkdir "C:\Users\%username%\Desktop\WellOS2\Users\%user%\Documents" 
echo %passwordreg% >"C:\Users\%username%\Desktop\WellOS2\Users\%user%\password".txt 
echo 2 >"C:\Users\%username%\Desktop\WellOS2\OSfiles\bootset".txt 
echo Your done. 
pause 
goto welloslog 
:booterror 
echo Sorry the boot file has an error. Check the user manual for BOOT$ 
pause 
:boot 
set /p boot=<"C:\Users\%username%\Desktop\WellOS2\OSfiles\bootset".txt 
if %boot% == 1 goto register 
if %boot% == 2 goto welloslog 
goto booterror 
cls 
:ERROR 
cls 
echo ----------ERROR------------------- 
echo %error% 
pause 
goto %back% 
:welloslog 
cls 
echo Welcome to WellOS2! 
echo ----------------LOGIN------------- 
set /p user= Username: 
if exist "C:\Users\%username%\Desktop\WellOS2\Users\%user%" goto pass 
set error= Sorry that account doesn't exist. 
set back=welloslog 
goto welloslogerror 
:pass 
set /p password=<"C:\Users\%username%\Desktop\WellOS2\Users\%user%\password".txt 
set /p passwordlog= Password: 
if /i %passwordlog% == %password% goto wellos 
set error= Sorry! wrong password. 
set back= welloslog 
goto error 
:wellos 
cls 
:wellosnocls 
echo --------------MAIN--------------- 
echo type help for help 
set /p command= #: 
if exist "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.sys" set type=sys 
if exist "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.pro" set type=pro 
if exist "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.sys" goto po 
if exist "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.pro" goto po 
set error= !Unreconized program/system program! 
set back=wellos 
goto error 
:po 
set lines=0 
echo --------------%command%.%type%--------------- 
:porep 
set /a lines=%lines% + 1 
set /p "code="<"C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.%type%\%command%.%type%-%lines%".wellcode 
if "%code%"=="GOWELL" goto wellosnocls 
findstr /I /L "if" "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.%type%\%command%.%type%-%lines%.wellcode" 
:skip 
call %code% 
goto porep 
::Tools 
:iftl 
%code% 
goto porep 

ПРОГРАММА OPENER (То, что я говорю, и проблемы с ...)

:po 
set lines=0 
echo --------------%command%.%type%--------------- 
:porep 
set /a lines=%lines% + 1 
set /p "code="<"C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.%type%\%command%.%type%-%lines%".wellcode 
if "%code%"=="GOWELL" goto wellosnocls 
findstr /I /L "if" "C:\Users\%username%\Desktop\WellOS2\Programdata\%command%.%type%\%command%.%type%-%lines%.wellcode" goto iftl 
:skip 
call %code% 
goto porep 
::Tools 
:iftl 
%code% 
goto porep 
+0

Почему 'ErrorLevel' не возможно? 'find' /' findstr' (re) установить его, если найдено совпадение/нет, поэтому после запроса сразу же он даст результат; если вы запросите 'ErrorLevel' в цикле/блоке, используйте [замедленное расширение] (http://ss64.com/nt/delayedexpansion.html) и используйте'! ErrorLevel! ', а не'% ErrorLevel% '... альтернативно проверьте, не является ли вывод 'find' /' findstr' пустым, путем разбора его с помощью 'for/F' ... – aschipfl

+0

Почти все, что вы запустили, будет устанавливать' ERRORLEVEL', даже если он просто устанавливает значение 0 для указания успеха. Если вы должны сохранить его, то лучше всего сохранить его в переменной, запустить свои команды и затем восстановить. См. Http: // stackoverflow.com/questions/6498460/batch-programming-error-handling-and-start-command/6527436 # 6527436 –

+0

Я готов поспорить, что вы использовали '% errorlevel%' внутри цикла, когда вы должны были использовать ' ! Равно! '. – SomethingDark

ответ

0
findstr "targetstring" datafilename >flagfilename 
for %%a in (flagfilename) do if %%~za==0 echo not found 
for %%a in (flagfilename) do if %%~za neq 0 echo found 

кроме того, ваш вопрос слишком расплывчатый.

+0

Я не получаю 'datafilename> flagfilename' часть первой строки. – TheBeastprogrammer

+0

Я понятия не имею, что такое имя вашего файла данных. Вы должны заменить его здесь. Вы можете использовать любое имя в качестве файла флага. Это будет файл, который будет создан с размером 0 или ненулевым. – Magoo

0

Следующая команда возвращает все строки текстового файла textfile.txt, которые содержат слово word (убрать переключатель /I, если вы хотите, чтобы поиск быть чувствительным к регистру):

findstr /I /L "word" "textfile.txt" 

С for /F вы можете захватить выход и тест является ли он пуст, так как цикл не итерацию, если совпадения не встречается:

set "FOUND=" 
for /F "delims=" %%F in (' 
    findstr /I /L "word" "textfile.txt" 
') do (
    set "FOUND=Yes" 
) 
if defined FOUND (
    echo One or more matches found. 
    rem do something... 
) else (
    echo No match found. 
    rem do something else... 
) 

Тип for /? и if /? в командной строке, чтобы получить подробную информацию о используемых командах.


Существует также способ использования ErrorLevel неявно, то есть вы не должны запрашивать его значение что-то вроде %ErrorLevel%, !ErrorLevel! или if ErrorLevel, а именно при использовании условных команд сепараторов:

  • && separator выполняет следующую команду только в том случае, если предыдущий преуспел, то есть он возвратил ErrorLevel из 0; (findstr возвращает 0 в случае, если совпадение встречается;)
  • || сепаратор выполняет следующую команду только в случае, если предыдущий не удалось, то есть, он возвращается ErrorLevel, кроме 0; (findstr возвращает ненулевое ErrorLevel в случае совпадения не встречается;)

Следующая строка кода демонстрирует использование:

findstr /I /L "word" "textfile.txt" && (echo One or more matches found.) || echo (No match found.) 
Смежные вопросы