FOR a special char in ('(reg add "^!")||echo.error' ) do ...

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
Ed Dyreen
Expert
Posts: 1569
Joined: 16 May 2011 08:21
Location: Flanders(Belgium)
Contact:

FOR a special char in ('(reg add "^!")||echo.error' ) do ...

#1 Post by Ed Dyreen » 08 Sep 2012 09:51

[edit 08 Sep 2012 22:41]

Inspired by The Great Escape

Sometimes I want to execute commands inside a for /f AND redirect the output AND act upon succes or failure.

Code: Select all

@echo off &prompt $G &setlocal enableDelayedExpansion

reg.EXE delete "HKLM\SOFTWARE\ED" /f>nul 2>&1

set ^"$v=0^^^c ^^^e ^^^q^^^c ^^^e^^^q ^^^c ^^^e" !
set ^"$d=0^^^c ^^^e ^^^q^^^c ^^^e^^^q ^^^c ^^^e" !
call :regadd

set ^"$v=1^^^c ^^^e ^^^"^^^c ^^^e^^^q ^^^c ^^^e" !
set ^"$d=1^^^c ^^^e ^^^q^^^c ^^^e^^^q ^^^c ^^^e" !
call :regadd

set ^"$v=2^^^c ^^^e ^^^"^^^c ^^^e^^^" ^^^c ^^^e" !
set ^"$d=2^^^c ^^^e ^^^"^^^c ^^^e^^^q ^^^c ^^^e" !
call :regadd

set ^"$v=3^^^^ ^^^e ^^^"^^^^ ^^^e^^^q ^^^^ ^^^e" !
set ^"$d=3^^^^ ^^^e ^^^"^^^^ ^^^e^^^q ^^^^ ^^^e" !
call :regadd

set ^"$v=4^^^^ ^^^! ^^^"^^^^ ^^^!^^^q ^^^^ ^^^!" !
set ^"$d=4^^^^ ^^^! ^^^"^^^^ ^^^!^^^q ^^^^ ^^^!" !
call :regadd

set ^"$v=5^^^^ ^^^! ^^^"^^^^ ^^^!^^^" ^^^^ ^^^!" !
set ^"$d=5^^^^ ^^^! ^^^"^^^^ ^^^!^^^" ^^^^ ^^^!" !
call :regadd

reg.EXE query "HKLM\SOFTWARE\ED"
pause
exit

:regadd
:: (
   echo.
   echo.$v=!$v!_
   echo.$d=!$d!_

::   reg escape quotes
   set $v=!$v:"=\"!
   set $d=!$d:"=\"!

::   reg enclose quotes
   set $v="!$v!"
   set $d="!$d!"

   for %%? in ( $v, $d ) do call :quoteEven %%?

   set "$a=reg.EXE add "HKLM\SOFTWARE\ED" /v !$v! /d !$d! /f"
   for /f "delims=" %%? in (

      'echo.!"!^(^!$a^!^)!"! ^^^!'

   ) do echo.%%?
   for /f "delims=" %%? in (

      '^(^!$a^!^)^|^|echo.error'

   ) do echo.%%?
:: )
exit /b 0

:quoteEven
:: (
   set "$=!%~1!"

::   delay twice, add quoted detector
   set "?=!$!"
   ::
   set "?=!?:"=""!"
   set "?=!?:^=^^^^!" &call set "?=%%^?:^!=#"#"^!%%" &set "?=!?:#"#"=^^^!"
   set "?=!?:""="!"
   ::
   set "?=%?%^!#q#^!"

::   delay special characters inside quotes
   set "$=!$:^=^^!" &call set "$=%%^$%%" !

::   quote evenly
   if "!?:~-5!" neq "^!#q#^!" (

      echo.escape uneven quote
      set "$=!$:~0,-1!^^^""
   )

   set "%~1=!$!"
:: )
exit /b 0

Code: Select all

$v=0c e qc eq c e_
$d=0c e qc eq c e_
(reg.EXE add "HKLM\SOFTWARE\ED" /v "0c e qc eq c e" /d "0c e qc eq c e" /f)
De bewerking is voltooid

$v=1c e "c eq c e_
$d=1c e qc eq c e_
escape uneven quote
(reg.EXE add "HKLM\SOFTWARE\ED" /v "1c e \"c eq c e^" /d "1c e qc eq c e" /f)
De bewerking is voltooid

$v=2c e "c e" c e_
$d=2c e "c eq c e_
escape uneven quote
(reg.EXE add "HKLM\SOFTWARE\ED" /v "2c e \"c e\" c e" /d "2c e \"c eq c e^" /f)

De bewerking is voltooid

$v=3^ e "^ eq ^ e_
$d=3^ e "^ eq ^ e_
escape uneven quote
escape uneven quote
(reg.EXE add "HKLM\SOFTWARE\ED" /v "3^ e \"^^ eq ^^ e^" /d "3^ e \"^^ eq ^^ e^"/f)
De bewerking is voltooid

$v=4^ ! "^ !q ^ !_
$d=4^ ! "^ !q ^ !_
escape uneven quote
escape uneven quote
(reg.EXE add "HKLM\SOFTWARE\ED" /v "4^ ! \"^^ !q ^^ !^" /d "4^ ! \"^^ !q ^^ !^"/f)
De bewerking is voltooid

$v=5^ ! "^ !" ^ !_
$d=5^ ! "^ !" ^ !_
(reg.EXE add "HKLM\SOFTWARE\ED" /v "5^ ! \"^^ !\" ^ !" /d "5^ ! \"^^ !\" ^ !" /f)
De bewerking is voltooid

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\ED
    0c e qc eq c e      REG_SZ  0c e qc eq c e
    1c e "c eq c e      REG_SZ  1c e qc eq c e
    2c e "c e" c e      REG_SZ  2c e "c eq c e
    3^ e "^ eq ^ e      REG_SZ  3^ e "^ eq ^ e
    4^ ! "^ !q ^ !      REG_SZ  4^ ! "^ !q ^ !
    5^ ! "^ !" ^ !      REG_SZ  5^ ! "^ !" ^ !
Druk op een toets om door te gaan. . .
Anyone who can make it shorter/more efficient ?, It's to be used as macro :mrgreen: Thanks

Post Reply