2017-01-06 32 views
2

У меня есть строка проверочного пакет, который обрабатывает элементарное регулярное выражение с FINDSTR и почти под названием квиты сегодня, когда я думал я не мог не правильно избежать каретки характера до I добавлено a более десятка^.Смешной каретка последовательность выхода при смешении FOR и FINDSTR

Fail-верификация Команда: stringVerifier.bat "Derpy QFail" "^^^^^^^^^^^^^^^^QFail" /R

Pass-верификация Команда: stringVerifier.bat "QFail Derpy" "^^^^^^^^^^^^^^^^QFail" /R

stringVerifier.bat

@echo off 

REM ===== Verify Sub-String In String Script ===== 
REM It uses Window's native findstr.exe commandline application with simplified options and scope for checking strings instead of file strings. 
REM Call this script by preceeding the commandline call with the word `call` instead of directly running it. 
REM 
REM Parameter 1 is the string to search through. This must be wrapped in double-quotes. 
REM Parameter 2 is the search pattern, e.g., "^QWARN". This must be wrapped in double-quotes. 
REM Parameter 3 should be either /R for Regular Expression search or /L for a string-literal search. 
REM Parameter 4 is optional. It should be true/false or t/f for case-sensitive searches. 
REM Parameter 4 behavior will default to false for case-sensitivity if left out of the commandline parameters when called. 
REM 
REM You can check success by exit code or if the value of %match_was_found% is true/false or if %match_found% isn't empty. 
REM A false value for %match_was_found% means there's no result to check due to no match occurring. 
REM A non-empty value for %match_found% always indicates success, and vice-versa. 
REM These values reset every time you run this script. 


REM Extract between 1 from the front and 1 from the end to strip commandline quotes 
Set string_to_search=%1 
Set string_to_search=%string_to_search:~1,-1% 
Set search_pattern=%2 
Set search_pattern=%search_pattern:~1,-1% 


Set search_type=%3 
Set case_sensitive=%4 
IF /i "%case_sensitive%"=="t" Set case_sensitive=true 
IF /i "%case_sensitive%"=="f" Set case_sensitive=false 
IF /i "%case_sensitive%"=="" Set case_sensitive=false 


IF "%string_to_search%"=="" echo You forgot to provide parameter one, %string_to_search%, to specify your string to search, e.g., "Start of line of this string"&&exit /b 1 
IF "%search_pattern%"=="" echo You forgot to provide parameter two, %search_pattern%, to specify your search pattern, e.g., "^Start of.*string$"&&exit /b 1 
IF "%search_type%"=="" echo You forgot to provide parameter three, %search_type%, to specify your search type, e.g., /R or /L&&exit /b 1 
IF /i NOT "%search_type%"=="/R" IF NOT "%search_type%"=="/L" echo You didn't provide the correct third parameter, %search_type%, for /R or /L&&exit /b 1 
IF /i NOT "%case_sensitive%"=="" IF NOT "%case_sensitive%"=="true" IF NOT "%case_sensitive%"=="false" echo You didn't provide the correct fourth, %case_sensitive%, parameter for true or false&&exit /b 1 


Set match_was_found= 
Set match_found= 
Set Command_To_Run= 
Set Command_Ender= 


Set Command_To_Run=echo.%string_to_search% 


IF NOT "%case_sensitive%"=="" IF NOT "%case_sensitive%"=="true" Set Command_Ender=/I 
IF "%search_type%"=="/R" (Set Command_Ender=%Command_Ender% /R %search_pattern%) ELSE (Set Command_Ender=%Command_Ender% /C:%search_pattern%) 


FOR /F "tokens=*" %%i IN (' %Command_To_Run% ^| findstr.exe %Command_Ender% ') DO Set match_found=%%i 


REM Deleting all variables we don't want retained as temporary env vars. 
IF "%match_found%"=="" Set match_was_found=false&&Set string_to_search=&&Set search_pattern=&&Set search_type=&&Set Command_To_Run=&&Set Command_Ender=&&Set case_sensitive=&&exit /b 1 
IF NOT "%match_found%"=="" Set match_was_found=true&&Set string_to_search=&&Set search_pattern=&&Set search_type=&&Set Command_To_Run=&&Set Command_Ender=&&Set case_sensitive= 


REM Comment out this line or add more script logic if you want to disable console output of the matching line 
echo %match_found% 
exit /b 0 

Есть ли способ обойти эту нелепую последовательность бежать в самой партии без генерироваться временные файлы и другие подобные раздражения для экранирования метасимволов регулярных выражений?

ответ

4

Вы использовали set variable Синтаксис отрицательный.
Как и без кавычек, каретки будут использоваться в любой команде SET, чтобы избежать следующего символа.

Эта линия будет потреблять половину вашего CARETS

Set search_pattern=%search_pattern:~1,-1% 

Вы должны использовать расширенный набор синтаксис:

set "variable=content" 

Но вам нужно всего лишь изменить некоторые из ваших линий, чтобы уменьшить общее количество до двух.

Set "search_pattern=%~2" This takes the argument and removes also the quotes 
... 
IF "%search_type%"=="/R" (Set "Command_Ender=%Command_Ender% /R %search_pattern%") ELSE (Set "Command_Ender=%Command_Ender% /C:%search_pattern%") 
... 
FOR /F "tokens=*" %%i IN (' %Command_To_Run% ^| findstr.exe %%Command_Ender%% ') DO Set match_found=%%i 

Теперь вам нужно всего лишь использовать

stringVerifier.bat "QFail Derpy" "^^QFail" /R 

Это потому, что последний Findstr еще потребляет один раз, CARETS.
Это может быть изменено также с помощью кавычек, но тогда вы должны изменить переменную Command_Ender, чтобы сохранить только параметры, но не строку поиска.

Чтобы проверить код, вы должны использовать в некоторых точках set Command_Ender или set search_pattern, чтобы показать реальное содержание ваших переменных.
Вы также должны взглянуть на delayed expansion, так как замедленное расширение никогда не изменяет содержимое переменной.

+0

Hm ... это определенно помогает сократить количество необходимых для этого элементов, поэтому я принял ответ на этой основе. Тем не менее, ваши обновленные строки фактически не работают должным образом. Это должно быть неудачным и не является: 'stringVerifier.bat" Derpy QFail "" ^^ QFail "/ R'. Для этого мне пришлось использовать 5-8 карманов: 'stringVerifier.bat" Derpy QFail "" ^^^^^^^^ QFail "/ R'. Я отлажу больше. TYVM для понимания, jeb! –

+0

Извинения, я забыл удалить эту строку, так что теперь она работает по назначению! 'Установить search_pattern =% search_pattern: ~ 1, -1%' –