Page 1 of 2
NOP+nested code.
Posted: 14 Mar 2014 11:37
by einstein1969
Hi to all,
I have problem with this code:
Code: Select all
@echo off & setlocal
rem first:
cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if not "!time:~9,2!"=="99" (if not "!time:~9,2!"=="00" (break) else exit) else exit" & echo ok
echo %time%
rem second:
start "" /B cmd /V:ON /Q /C"cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if not "!time:~9,2!"=="99" (if not "!time:~9,2!"=="00" (break) else exit) else exit" & echo ok"
I have two question:
1) The "first" part work well but the "second" part don't work (go in loop).
How to modify code for working the second part?
2) NOP: I searching for NO Operation. I have used "break".
There are other NOP?
einstein1969
Re: NOP+nested code.
Posted: 14 Mar 2014 13:20
by Ed Dyreen
why not reverse the if condition ?
or even
Code: Select all
if "!time:~9,2!"=="00" (exit) else rem.this does nothing
instead of
Code: Select all
if not "!time:~9,2!"=="00" (break) else exit
I assume that if 1==0 equals break ? Why not use rem. ?
Re: NOP+nested code.
Posted: 14 Mar 2014 14:35
by einstein1969
Hi Ed,
thanks , i have optimized the code
Code: Select all
cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit) else rem.this does nothing)" & echo ok
echo %time%
cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok
echo %time%
start "" /B cmd /V:ON /Q /C"cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok"
generally (in code more complex ) I don't use the REM because with the REM ignores all the rest of the line.
The first and the second work well.
The third go in loop
einstein1969
Re: NOP+nested code.
Posted: 14 Mar 2014 15:43
by Ed Dyreen
einstein1969 wrote:Hi Ed,
thanks , i have optimized the code
Code: Select all
cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit) else rem.this does nothing)" & echo ok
echo %time%
cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok
echo %time%
start "" /B cmd /V:ON /Q /C"cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok"
generally (in code more complex ) I don't use the REM because with the REM ignores all the rest of the line.
You can insert a "delayed" linefeed to counter that.
Code: Select all
@echo off &setlocal enableDelayedExpansion
set $lf=^
::
set ^"$n1c=^^^%$lf%%$lf%^%$lf%%$lf%^^"
set ^"macro=(^
echo ok0%$n1c%
for /L %%k in (1,0,1) do if "^!time:~9,2^!"=="99" (^
exit^
) else if "^!time:~9,2^!"=="00" (^
exit^
) else rem.this does nothing%$n1c%
echo ok1%$n1c%
)"
set "macro"
%= inject delay once =%
set "?=!macro!"
for %%r in ("!$lf!") do for %%? in ("%%$lf%%") do set ?=!?:%%~r=%%~?!
set "macro=!?!"
set "macro"
cmd /v:on /e:on /t:0B /q /c "!macro!"
pause
exit /b
Code: Select all
macro=(
echo ok0
for /L %k in (1,0,1) do if "!time:~9,2!"=="99" (
exit
) else if "!time:~9,2!"=="00" (
exit
) else rem.this does nothing
echo ok1
)
macro=(%$lf% echo ok0%$lf%%$lf% for /L %k in (1,0,1) do if "!time:~9,2!"
=="99" (%$lf% exit%$lf% ) else if "!time:~9,2!"=="00" (%$lf%
exit%$lf% ) else rem.this does nothing%$lf%%$lf% echo ok1%$lf%)
ok0
Druk op een toets om door te gaan. . .
einstein1969 wrote:Code: Select all
start "" /B cmd /V:ON /Q /C"cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok"
generally (in code more complex ) I don't use the REM because with the REM ignores all the rest of the line.
The first and the second work well.
The third go in loop
In the third example you start cmd twice with v:on, now you need to escape once more so the time is updated in realtime
Code: Select all
@echo off
start "" /B cmd /V:ON /Q /C "cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do echo.if "^!time:~9,2^!"=="99" echo ok"
pause
exit /b
Code: Select all
if "54"=="99 echo ok
if "54"=="99 echo ok
if "56"=="99 echo ok
if "56"=="99 echo ok
etc...
Re: NOP+nested code.
Posted: 14 Mar 2014 17:06
by penpen
einstein1969 wrote:I don't use the REM because with the REM ignores all the rest of the line
You may add a double colon to rem, so the special keys are working, and the rest of the line should not be ignored anymore:
Code: Select all
if 0==0 (rem:) else echo 1
if 0==1 (rem:) else echo 0
penpen
Re: NOP+nested code.
Posted: 15 Mar 2014 00:43
by Liviu
penpen wrote:You may add a double colon to rem, so the special keys are working, and the rest of the line should not be ignored anymore:
Code: Select all
if 0==0 (rem:) else echo 1
if 0==1 (rem:) else echo 0
Not sure what you mean by "
so the special keys are working" but the (rem:) trick is neat regardless
Still, it's not a no-op technically. If you watch cmd.exe with sysinternals' Process Monitor you'll notice that typing "rem:" at the cmd prompt causes a file-system-level inquiry for "rem:" (FastIoQueryOpen) which does not occur for a plain "rem" without the ":" colon. The "rem:" inquiry fails because of "invalid name", and I guess that's caught early - before and without any disk access. And it appears that cmd decides to do nothing about the reported failure, so it works out as a no-op in the end, but - again, strictly technically - it's not as if cmd translated it into a NOP upfront.
Liviu
Re: NOP+nested code.
Posted: 15 Mar 2014 16:39
by Ed Dyreen
einstein1969 wrote:I don't use the REM because with the REM ignores all the rest of the line.
And if not, the worst thing that can happen is it causing your script to crash
Code: Select all
@echo off
REM does not ignores all the rest of the line. %~*
REM.does not ignores all the rest of the line. %~*
Code: Select all
Het volgende gebruik van de padoperator bij het vervangen
van batchparameters is ongeldig: %~*
Typ CALL /? of FOR /? voor geldige gebruiksmogelijkheden.
De syntaxis van de opdracht is onjuist.
Re: NOP+nested code.
Posted: 15 Mar 2014 20:09
by einstein1969
Ed Dyreen wrote:einstein1969 wrote:I don't use the REM because with the REM ignores all the rest of the line.
And if not, the worst thing that can happen is it causing your script to crash
Code: Select all
@echo off
REM does not ignores all the rest of the line. %~*
REM.does not ignores all the rest of the line. %~*
Code: Select all
Het volgende gebruik van de padoperator bij het vervangen
van batchparameters is ongeldig: %~*
Typ CALL /? of FOR /? voor geldige gebruiksmogelijkheden.
De syntaxis van de opdracht is onjuist.
I did not know this thing
I am studying the macro you posted previously ...
@penpen
I will remember in future. and ...
@Liviu
I have done some tests
The code that i using is in a PIPED code.
I have tested and there is a problem with the SPACES added
There are workaround for the spaces?
Code: Select all
@echo off & setlocal
cls
:: Setting
set /a max_loops=1000*4*20
set "LOG=nop.log.txt"
set "FILE=temp.$$$"
set list="type nul" "rem:" "break" "call" "call " "title" "echo/>nul"
:: clear LOG
break > %LOG%
:: Do Testing
for %%N in (%list%) do call :NOP %%N
:: Print Performance results
echo/
Echo NOP Loops Elapsed[cs] Avg[microsec] Type
echo -----------------------------------------------------------------------
for %%N in (%list%) do (
Echo/
set H=%%~N____
set "d= %%N"
for %%T in (NO_PIPE PIPE CLEAR) do (
call set HH=%%H::=%%
call set HH=%%HH:~0,5%%_%%T
for /f "tokens=1-3 delims=;" %%f in ('call echo %%%%HH%%%%') do call echo %%d:~-14%% %%h %%f %%g [%%T]
)
)
:: Show the LOG
start notepad %LOG%
exit /b
:Nop
set "NOP=%~1"
if "%NOP%"=="echo/>nul" set /a max_loops*=10
set t0=%time%
:: TEST with no PIPE
For /L %%n in (1,1,%max_loops%) do (
%NOP%
(if %%n == 1 (
echo/
echo Testing... NOP:'%NOP:>=%' [NO_PIPE]
)
)
%NOP%
)
call :time "%t0%" "%time%" NO_PIPE
:: test clear file
set /a max_loops/=4
del %FILE% 2>nul
set t0=%time%
:: TEST with no PIPE
For /L %%n in (1,1,%max_loops%) do (
%NOP%>%FILE%
(if %%n == 1 (
echo Testing... NOP:'%NOP:>=%' [clear file]
)
)
)
call :time "%t0%" "%time%" CLEAR
if not exist %FILE% echo FILE ERROR!
set /a max_loops*=4
if "%NOP%"=="title" set /a max_loops/=20
set t0=%time%
:: TEST with PIPE
break| For /L %%n in (1,1,1000000) do @(
%NOP%
(if %%n==%max_loops% (exit))
(if %%n == 1 (
echo Testing... NOP:'%NOP:>=%' [PIPE]
( echo Testing... NOP:'%NOP:>=%' [PIPE]
echo/
echo cmdcmdline: %%cmdcmdline%%
) >> %LOG%
)
)
%NOP%
)
call :time "%t0%" "%time%" PIPE
:: Check %errorlevel%
(%NOP%)
(
echo/
echo NOP:'%NOP%' Errorlevel:%errorlevel%
echo/
) >> %LOG%
exit /b
:time
set "t=%~1:%~2"
For /F "tokens=1-8 delims=:.," %%a in ("%t: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, avg=a*10000/max_loops"
set H=%NOP::=%____
rem echo %H% %H:~0,5%_%3=%a%;%avg%;%max_loops%
set %H:~0,5%_%3=%a%;%avg%;%max_loops%
exit /b
results:
Code: Select all
Testing... NOP:'type nul' [NO_PIPE]
Testing... NOP:'type nul' [clear file]
Testing... NOP:'type nul' [PIPE]
Testing... NOP:'rem:' [NO_PIPE]
Testing... NOP:'rem:' [clear file]
Testing... NOP:'rem:' [PIPE]
Testing... NOP:'break' [NO_PIPE]
Testing... NOP:'break' [clear file]
Testing... NOP:'break' [PIPE]
Testing... NOP:'call' [NO_PIPE]
Testing... NOP:'call' [clear file]
Testing... NOP:'call' [PIPE]
Testing... NOP:'call ' [NO_PIPE]
Testing... NOP:'call ' [clear file]
Testing... NOP:'call ' [PIPE]
Testing... NOP:'title' [NO_PIPE]
Testing... NOP:'title' [clear file]
Testing... NOP:'title' [PIPE]
Testing... NOP:'echo/nul' [NO_PIPE]
Testing... NOP:'echo/nul' [clear file]
Testing... NOP:'echo/nul' [PIPE]
NOP Loops Elapsed[cs] Avg[microsec] Type
-----------------------------------------------------------------------
"type nul" 80000 903 112 [NO_PIPE]
"type nul" 80000 1112 139 [PIPE]
"type nul" 20000 652 326 [CLEAR]
"rem:" 80000 613 76 [NO_PIPE]
"rem:" 80000 794 99 [PIPE]
"rem:" 20000 582 291 [CLEAR]
"break" 80000 328 41 [NO_PIPE]
"break" 80000 515 64 [PIPE]
"break" 20000 535 267 [CLEAR]
"call" 80000 302 37 [NO_PIPE]
"call" 80000 597 74 [PIPE]
"call" 20000 570 285 [CLEAR]
"call " 80000 450 56 [NO_PIPE]
"call " 80000 609 76 [PIPE]
"call " 20000 578 289 [CLEAR]
"title" 80000 489 61 [NO_PIPE]
"title" 4000 922 2305 [PIPE]
"title" 20000 561 280 [CLEAR]
"echo/>nul" 40000 1034 258 [NO_PIPE]
"echo/>nul" 40000 1156 289 [PIPE]
"echo/>nul" 10000 373 373 [CLEAR]
LOG:
Code: Select all
Testing... NOP:'type nul' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( type nul & ( if 1== 80000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'type nul' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'type nul' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & type nul ) "
NOP:'type nul' Errorlevel:0
Testing... NOP:'rem:' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( rem: & ( if 1== 80000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'rem:' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'rem:' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & rem: ) "
NOP:'rem:' Errorlevel:0
Testing... NOP:'break' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( break & ( if 1== 80000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'break' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'break' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & break ) "
NOP:'break' Errorlevel:0
Testing... NOP:'call' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( call & ( if 1== 80000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'call' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'call' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & call ) "
NOP:'call' Errorlevel:1
Testing... NOP:'call ' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( call & ( if 1== 80000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'call ' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'call ' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & call ) "
NOP:'call ' Errorlevel:0
Testing... NOP:'title' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( title & ( if 1== 4000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'title' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'title' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & title ) "
NOP:'title' Errorlevel:0
Testing... NOP:'echo/nul' [PIPE]
cmdcmdline: C:\Windows\system32\cmd.exe /S /D /c" FOR /L 1 in (1 1 1000000) do @ ( echo/ 1>nul & ( if 1== 40000 ( exit ) ) & ( if 1== 1 ( echo Testing... NOP:'echo/nul' [PIPE] & 1>>nop.log.txt ( echo Testing... NOP:'echo/nul' [PIPE] & echo/ & echo cmdcmdline: %cmdcmdline% ) ) ) & echo/ 1>nul ) "
The title command in Piped version is slow because there are space added i thinks.
EDIT: correct some bugs + added timing for touch/clear a file.
einstein1969
Re: NOP+nested code.
Posted: 16 Mar 2014 11:29
by einstein1969
Ed Dyreen wrote:In the third example you start cmd twice with v:on, now you need to escape once more so the time is updated in realtime
Code: Select all
@echo off
start "" /B cmd /V:ON /Q /C "cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do echo.if "^!time:~9,2^!"=="99" echo ok"
pause
exit /b
Code: Select all
if "54"=="99 echo ok
if "54"=="99 echo ok
if "56"=="99 echo ok
if "56"=="99 echo ok
etc...
I have started from this:
original:
Code: Select all
start "" /B /WAIT cmd /V:ON /Q /C"cmd /V:ON /Q /C"for /L %%k in (1,0,1) do if "!time:~9,2!"=="99" (exit) else (if "!time:~9,2!"=="00" (exit))" & echo ok"
than i have added the caret ^
first mod:
Code: Select all
start "" /B /WAIT cmd /V:ON /Q /C"cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do if "^!time:~9,2^!"=="99" (exit) else (if "^!time:~9,2^!"=="00" (exit))" & echo %%time%% %time% !time! ok"
but execute the echo in the nested cmd
than I have tried and the code work after adding a second " near the end
second mod:
Code: Select all
start "" /B /WAIT cmd /V:ON /Q /C"cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do if "^!time:~9,2^!"=="99" (exit) else (if "^!time:~9,2^!"=="00" (exit))"" & call echo %%time%% %time% !time! ok"
result:
Code: Select all
18:13:22,99 18:13:21,99 !time! ok"
but i think that is no good because i need using "call echo". And there is an " at the end.
I want that the nested cmd exit and than "echo" run without "call".
What should I change?
einstein1969
Re: NOP+nested code.
Posted: 16 Mar 2014 12:37
by Ed Dyreen
einstein1969 wrote:second mod:
Code: Select all
start "" /B /WAIT cmd /V:ON /Q /C"cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do if "^!time:~9,2^!"=="99" (exit) else (if "^!time:~9,2^!"=="00" (exit))"" & call echo %%time%% %time% !time! ok"
result:
Code: Select all
18:13:22,99 18:13:21,99 !time! ok"
but i think that is no good because i need using "call echo". And there is an " at the end.
I want that the nested cmd exit and than "echo" run without "call".
What should I change?
Since you appended to the command it works in that
Code: Select all
call echo %%time%% %time% !time! ok
the time the command is executed is displayed "echo %time%".
the time the command is finished is displayed "call echo %%time%%".
but this obviously doesn't "!time!" as you forgot to enable delayed expansion
Code: Select all
@echo off
echo.time.str=%time%_
cmd /V:ON /Q /C^"^
for /L %%k in (^
1,0,1^
) do if "!time:~9,2!"=="99" (^
exit^
)else if "!time:~9,2!"=="00" (^
exit^
)^
"
echo.time.end=%time%_
pause
exit /b
Code: Select all
time.str=19:35:25,28_
time.end=19:35:26,00_
Druk op een toets om door te gaan. . .
einstein1969 wrote:And there is an " at the end.
If you count the quotes you see that you add a double quote at the end of the line but your command inside a child cmd session is already complete
Code: wrote:start "" /B /WAIT cmd /V:ON /Q /C"cmd /V:ON /Q /C^"for /L %%k in (1,0,1) do if "^!time:~9,2^!"=="99" (exit) else (if "^!time:~9,2^!"=="00" (exit))"" & call echo %%time%% %time% !time! ok"
This works since the previous quote is consumed by the child session.
Code: Select all
@echo off
cmd /V:ON /Q /C"cmd /V:ON /Q /C^"echo.^>nul"" & call echo %%time%% %time% !time! ok"
cmd /V:ON /Q /C"cmd /V:ON /Q /Cecho.a!^>nul" &echo.b! &call echo %%time%% %time% !time! ok"
pause
exit /b
Code: Select all
19:48:54,75 19:48:54,64 !time! ok"
b!
19:48:54,87 19:48:54,75 !time! ok"
Btw;
What is the point of running a cmd session inside a cmd session ?
Re: NOP+nested code.
Posted: 16 Mar 2014 12:49
by einstein1969
the code is inside another code. I need to run async.
the code i more complex. This is only a part.
This is the old code that not work:
Code: Select all
(
For /L %%i in (1,1,10) do @(
start "" /B cmd /V:ON /Q /C"( break|for /L %%k in (1,0,1) do if not "!time:~9,2!"=="99" (if not "!time:~9,2!"=="00" (break) else (exit /b 1) ) else (exit /b 1) ) & (ping ::1 -n 5 -l 1)"
ping ::1 -n 2 >nul
For /L %%j in (0,1,1000) do @break
)
) | find "<" | ...
einstein1969
Re: NOP+nested code.
Posted: 16 Mar 2014 13:07
by Ed Dyreen
I see,
One other thing, don't these long lines read much easier with line breaks ?
Code: Select all
@echo off
echo.time.str=%time%_
cmd /V:ON /Q /C^"^
for /L %%k in (^
1,0,1^
) do if "!time:~9,2!"=="99" (^
exit^
)else if "!time:~9,2!"=="00" (^
exit^
)^
"
echo.time.end=%time%_
pause
exit /b
You make it difficult to keep track of quoted status and general understanding. Even you got confused just previously.
Re: NOP+nested code.
Posted: 16 Mar 2014 14:21
by einstein1969
Ed Dyreen wrote:I see,
One other thing, don't these long lines read much easier with line breaks ?
Code: Select all
@echo off
echo.time.str=%time%_
cmd /V:ON /Q /C^"^
for /L %%k in (^
1,0,1^
) do if "!time:~9,2!"=="99" (^
exit^
)else if "!time:~9,2!"=="00" (^
exit^
)^
"
echo.time.end=%time%_
pause
exit /b
You make it difficult to keep track of quoted status and general understanding. Even you got confused just previously.
Thanks,
this is better.
Now i want to start async with start
I have insert in the code:
Code: Select all
(
For /L %%i in (1,1,10) do @(
:: this part need start aync. The output need go to pipe with FIND "<". I think to use START.
echo.time.str=%time%_
cmd /V:ON /Q /C^"^
for /L %%k in (^
1,0,1^
) do if "!time:~9,2!"=="99" (^
exit^
)else if "!time:~9,2!"=="00" (^
exit^
)^
"
echo.time.end=%time%_
ping ::1 -n 5
:: here finish the part to start async
ping ::1 -n 2 >nul
For /L %%j in (0,1,1000) do @break
)
) | find "<"
but already it does not work:
einstein1969
Re: NOP+nested code.
Posted: 16 Mar 2014 15:48
by Ed Dyreen
If a double colon is used inside a code block then a special rule applies.
It must be followed by a valid command or it crash your script.
Code: Select all
(
:: this works, the double colon is followed by a valid command
rem
)
Re: NOP+nested code.
Posted: 16 Mar 2014 15:58
by einstein1969
Ed Dyreen wrote:If a double colon is used inside a code block then a special rule applies.
It must be followed by a valid command or it crash your script.
Code: Select all
(
:: this works, the double colon is followed by a valid command
rem
)
thanks,
i have removed the comment but the problem remain:
Code: Select all
(
For /L %%i in (1,1,10) do @(
echo.time.str=%time%_
cmd /V:ON /Q /C^"^
for /L %%k in (^
1,0,1^
) do if "!time:~9,2!"=="99" (^
exit^
)else if "!time:~9,2!"=="00" (^
exit^
)^
"
echo.time.end=%time%_
ping ::1 -n 5
ping ::1 -n 2 >nul
For /L %%j in (0,1,1000) do @break
)
) | find "<"
einstein1969