Windows 单行嵌套循环

Windows 单行嵌套循环,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试使用单行cmd/c来获得一个没有分支的内部循环。(实际上我有执行循环的showLines例程。)我知道它的性能最差,但我想知道是否有可能在没有引号的情况下运行它。当前它引发“%G此时意外”错误。因此,它需要一些正确的变量转义或扩展 @echo关闭 setlocal enableDelayedExpansion 设置“参数=%~1” netstat-aonb | findstr/n$>tmpFile_内容 对于('type tmpFile_Content^ | findstr/r/c:“

我正在尝试使用单行
cmd/c
来获得一个没有分支的内部循环。(实际上我有执行循环的showLines例程。)我知道它的性能最差,但我想知道是否有可能在没有引号的情况下运行它。当前它引发“%G此时意外”错误。因此,它需要一些正确的变量转义或扩展

@echo关闭
setlocal enableDelayedExpansion
设置“参数=%~1”
netstat-aonb | findstr/n$>tmpFile_内容
对于('type tmpFile_Content^ | findstr/r/c:“%param%”/i)中的/F“tokens=*”%%A(
设置行=%%A
对于/F“tokens=1 delims=:”%%I in(“!line!”)DO(
set/a LineNum=%%I
rem set/a NEXTLINEUM=LineNum+1
)
set/a lineNum=!lineNum!-1
if!lineNum!==0(set param=“tokens=*”)else(set param=“tokens=*skip=!lineNum!”)
rem在引用中可以很好地工作
cmd/q/v:on/c“@echo off&&setlocal enableDelayedExpansion&&set cnt=2&&for/F%%param%%%B in(tmpFile_内容)do(echo%%B&&set/a cnt-=1>nul&&if^!cnt^!==0退出/B)”
rem Following不起作用,即使cmd应该在/c之后使用其余参数
cmd/q/v:on/c setlocal enableDelayedExpansion&&FOR/F“令牌=*”%%c IN('echo!param!')DO(FOR/F%%c%%G IN(tmpFile_内容)DO(echo%%G&&set/a cnt-^=1>num&&if^!cnt^!==0退出/b))
rem呼叫:showLines!LineNum!
)
del tmpFile_内容
后藤:eof
:展品
设置/a行数=%1-1
设置cnt=2
对于(tmpFile_内容)do中的/F“tokens=*skip=%lineNum%”%%B(
回声%%B
设置/a cnt-=1
如果!cnt!==0转到exitLoop
)
:exitLoop
退出/b

要构造具有可变参数的循环,基本上需要将它们定义为宏并执行。例如:

@Echo Off&Setlocal ENABLEdelayedExpasnion
Set param=“tokens=*delims=”
设置“测试=字符串行”
设置为(“^!测试^!”)中的/F%param%%%G执行回显%%G
%为%
当然,您可以更进一步,使用另一个for循环宏动态构建整个for循环

更新:
  • 用于定义命令的条件连接的方法现在已举例说明
  • 语法简化为允许在规则扩展和代码块内使用相同的使用形式,方法是让构造函数宏调用一个子例程来扩展新的for循环
  • 延迟串联变量使用简化,以避免转义要求
@Echo关闭
:{宏定义
Setlocal DisabledelayedExpansion
(设置\n=^^^
%=这将创建转义换行符-请勿更改=%
)
:[For Loop Constructor macro.]适用于需要在代码块期间使用动态For Loop选项的高级程序员。
:-用法:%n.For%{For loop options}{variable set}{For Metavariable}{要执行的命令}
:-使用delayed!和!变量在新的for循环中构造串联命令。
如果%%n==2(%\n%
设置为=%\n%
对于/F“tokens=1,2,3,4 Delims={}”%%1 in(!mac.in!”)Do(%\n%
设置“FOR=FOR/F%%1%%3 in(!%%2!”)Do(%%~4)”%\n%
)%\n%
呼叫:Exc.For%\n%
)否则就让麦克进来=
设置“and.=&&”
设置“and=!and.!”
:}结束宏定义。
Setlocal EnableDelayedExpansion&rem//需要为构造函数宏展开n
用法示例:
设置“示例=是字符串行”
%n、 对于%{“tokens=*delims=“}{example}{%%G}{Echo/%%%G}
%n、 对于%{“tokens=1,2,3,4 delims=“}{example}{%%G}{”Echo/%%~J%%~G%%~H%%~I!和!Echo/%%~I%%~G%%~H%%~J”}
设置“example2=代码块示例”
对于(1 2 3)中的%%a,请执行以下操作(
%n、 对于%{“Tokens=%%a Delims=“}{example2}{%%I}{”For/L%%#in(11 4)Do(Set%%I[%%#]=%%a%%#)!和!Set%%I[%%#]]
)
暂停>Nul
后藤:EOF
:Exc.For
%为%
退出/B
示例输出:

is a string line
line is a string 
string is a line
Code[1]=11
Code[2]=12
Code[3]=13
Code[4]=14
block[1]=21
block[2]=22
block[3]=23
block[4]=24
example[1]=31
example[2]=32
example[3]=33
example[4]=34

要构造具有可变参数的for循环,基本上需要将它们定义为宏并执行。例如:

@Echo Off&Setlocal ENABLEdelayedExpasnion
Set param=“tokens=*delims=”
设置“测试=字符串行”
设置为(“^!测试^!”)中的/F%param%%%G执行回显%%G
%为%
当然,您可以更进一步,使用另一个for循环宏动态构建整个for循环

更新:
  • 用于定义命令的条件连接的方法现在已举例说明
  • 语法简化为允许在规则扩展和代码块内使用相同的使用形式,方法是让构造函数宏调用一个子例程来扩展新的for循环
  • 延迟串联变量使用简化,以避免转义要求
@Echo关闭
:{宏定义
Setlocal DisabledelayedExpansion
(设置\n=^^^
%=这将创建转义换行符-请勿更改=%
)
:[For Loop Constructor macro.]适用于需要在代码块期间使用动态For Loop选项的高级程序员。
:-用法:%n.For%{For loop options}{variable set}{For Metavariable}{要执行的命令}
:-使用delayed!和!变量在新的for循环中构造串联命令。
如果%%n==2(%\n%
设置为=%\n%
对于/F“tokens=1,2,3,4 Delims={}”%%1 in(!mac.in!”)Do(%\n%
设置“FOR=FOR/F%%1%%3 in(!%%2!”)Do(%%~4)”%\n%
)%\n%
呼叫:Exc.For%\n%
)否则就让麦克进来=
设置“and.=&&”
设置“and=!and.!”
:}结束宏定义。
Setlocal EnableDelayedExpansion&rem//需要为构造函数宏展开n
用法示例:
设置“示例=是字符串行”
%n、 对于%{“tokens=*delims=“}{example}{%%G}{Echo/%%%G}
%n、 对于%{“tokens=1,2,3,4 delims=“}{example}{%%G}{”Echo/%%~J%%~G%%~H%%~I!和!Echo/%%~I%%~G%%~H%%~J”}
设置“example2=代码块示例”
对于(1 2 3)中的%%a,请执行以下操作(
%n、 对于%{“Tokens=%%a Delims=“}{example2}{%%I}{”For/L%%#in(11 4)Do(Set%%I[%%#]=%%a%%#)!和!Set%%I[%%#]]
)
暂停>Nul
后藤:EOF
:Exc.For
%为%
退出/B
示例输出:

is a string line
line is a string 
string is a line
Code[1]=11
Code[2]=12
Code[3]=13
Code[4]=14
block[1]=21
block[2]=22
block[3]=23
block[4]=24
example[1]=31
example[2]=32
example[3]=33
example[4]=34