1

今天我做了大约 5 次,并for /?在所有屏幕上隔开以找到替换参考的底部,我决定想出一种方法来快速轻松地获得它。过了一会儿,我想出了:

for /? | more +118 

我将它转储到一个批处理文件中,并将其命名为 optparams.cmd,它正是我想要的。现在,我想做同样的事情,SET但只列出环境变量替换部分。我可以MORE再次做到这一点,但是当我完成后,我必须滚动浏览其余的屏幕。

我的问题是:在给定开始和结束参数的情况下,仅显示 STDOUT 部分的最简单方法是什么?行号或某些文本字符串是最好的。我在想将它全部读入一个数组将是开始的方式,但我现在仍在尝试批量处理数组。任何见解或提示表示赞赏。

编辑:我将 MC ND 的帖子变成了以下功能,它基本上可以满足我的需求。

    call :ExtractBetween 68 96 "set /?"
    exit /b


    :ExtractBetween start stop cmd
    @echo off & setlocal
    set _start=%1 & set _end=%2 & set _cmd=%~3
    for /F "tokens=1,* delims=:" %%f in (
    '%_cmd% ^| findstr /n /r "." ') do (
        if %%f geq %_start% if %%f leq %_end% (
            echo %%g)
    ) 
    exit /b
4

3 回答 3

3

下面的批处理文件提取一系列行:从第一个字符串的第一次出现到第二个字符串的最后一次出现,或多行:

@echo off
setlocal DisableDelayedExpansion

if "%~3" neq "" goto start
echo Show a range of lines, from "start string" to "end string" or number of lines
echo/
echo ShowRange.bat inputfile "start string" "end string"
echo ShowRange.bat inputfile "start string" /N:24
goto :EOF

:start
set end=%~3
if /I "%end:~0,3%" neq "/N:" (
   for /F "delims=:" %%a in ('findstr /N /C:%2 /C:%3 %1') do (
      if not defined start (
         set /A start=%%a-1
      ) else (
         set end=%%a
      )
   )
   set /A lines=end-start
) else (
   for /F "delims=:" %%a in ('findstr /N /C:%2 %1') do (
      if not defined start set /A start=%%a-1
   )
   set lines=%end:~3%
)

if %start% neq 0 set skip=skip=%start%
for /F "%skip% delims=" %%a in ('findstr /N "^" %1') do (
   set "line=%%a"
   setlocal EnableDelayedExpansion
   set "line=!line:*:=!"
   echo(!line!
   set /A lines-=1
   if "!lines!" equ "0" goto :EOF
   for /F %%b in ("!lines!") do endlocal & set lines=%%b
)

例如:

set /? > set.txt
ShowRange.bat set.txt "Environment variable substitution" "would extract"
ShowRange.bat set.txt "Environment variable substitution" /N:24

编辑:下面的版本从 STDIN 读取输入,因此可以与管道一起使用,但速度较慢,因为它必须在每个输入行中实现“查找字符串”部分:

@echo off
setlocal DisableDelayedExpansion

if "%~2" neq "" goto start
echo Show a range of lines, from "start string" to "end string" or number of lines
echo/
echo command ^| ShowRangePipe.bat "start string" "end string"
echo command ^| ShowRangePipe.bat "start string" /N:24
goto :EOF

:start
set startFound=no
set end=%~2
if /I "%end:~0,3%" neq "/N:" (
   for /F "delims=" %%a in ('findstr /N "^"') do (
      set "line=%%a"
      setlocal EnableDelayedExpansion
      set "line=!line:*:=!"
      if "!startFound!" equ "no" (
         if defined line if "!line:%~1=!" neq "!line!" set startFound=yes & echo !line!
      ) else (
         echo(!line!
         if defined line if "!line:%~2=!" neq "!line!" goto :EOF
      )
      for /F %%b in ("!startFound!") do endlocal & set startFound=%%b
   )
) else (
   set /A lines=%end:~3%-1
   for /F "delims=" %%a in ('findstr /N "^"') do (
      set "line=%%a"
      setlocal EnableDelayedExpansion
      set "line=!line:*:=!"
      if "!startFound!" equ "no" (
         if defined line if "!line:%~1=!" neq "!line!" set startFound=yes & echo !line!
      ) else (
         echo(!line!
         set /A lines-=1
         if "!lines!" equ "0" goto :EOF
      )
      for /F "tokens=1,2" %%b in ("!startFound! !lines!") do endlocal & set "startFound=%%b" & set lines=%%c
   )
)

例如:

set /? | ShowRangePipe.bat "Environment variable substitution" "would extract"
set /? | ShowRangePipe.bat "Environment variable substitution" /N:24
于 2013-10-25T02:33:55.673 回答
2

Windows和范围地址的 sed 示例:

>设置/?| sed "/环境变量替换/,+24!d
环境变量替换已增强如下:

    %PATH:str1=str2%

将扩展 PATH 环境变量,替换每个出现
使用“str2”的扩展结果中的“str1”。“str2”可以为空
字符串以有效地从扩展中删除所有出现的“str1”
输出。“str1”可以以星号开头,在这种情况下它将匹配
从扩展输出的开始到第一个
str1 的剩余部分的出现。

也可以为扩展指定子字符串。

    %路径:~10,5%

将扩展 PATH 环境变量,然后仅使用 5
从扩展的第 11 个(偏移量 10)字符开始的字符
结果。如果未指定长度,则默认为
变量值的剩余部分。如果任一数字(偏移量或长度)是
负数,则使用的数字是环境变量的长度
添加到指定的偏移量或长度的值。

    %路径:~-10%

将提取 PATH 变量的最后 10 个字符。

>设置/?| sed "/环境变量替换/,/将提取/!d
环境变量替换已增强如下:

    %PATH:str1=str2%

将扩展 PATH 环境变量,替换每个出现
使用“str2”的扩展结果中的“str1”。“str2”可以为空
字符串以有效地从扩展中删除所有出现的“str1”
输出。“str1”可以以星号开头,在这种情况下它将匹配
从扩展输出的开始到第一个
str1 的剩余部分的出现。

也可以为扩展指定子字符串。

    %路径:~10,5%

将扩展 PATH 环境变量,然后仅使用 5
从扩展的第 11 个(偏移量 10)字符开始的字符
结果。如果未指定长度,则默认为
变量值的剩余部分。如果任一数字(偏移量或长度)是
负数,则使用的数字是环境变量的长度
添加到指定的偏移量或长度的值。

    %路径:~-10%

将提取 PATH 变量的最后 10 个字符。
于 2013-10-24T20:39:05.907 回答
2

用 findstr 计算行数,并在行号之间过滤

@echo off
    setlocal enableextensions
    set _start=%1
    set _end=%2
    for /F "tokens=1,* delims=:" %%f in ('for /? ^| findstr /n /r "." ') do (
        if %%f geq %_start% if %%f leq %_end% (
            echo %%g
        )
    )
于 2013-10-24T20:20:18.120 回答