如何在批处理文件中提取文本后?

时间:2017-12-13 15:27:26

标签: batch-file

我有一个类似这样的批处理文件:

50-A Description of the item $23

我有一个脚本可以提取$符号之前的内容,但我需要在$符号后提取所有内容。

这是脚本:

for /f "tokens=1 delims=/" %%a in (test.txt) do (echo %%a >> newfile.txt)

我该怎么改变它?

4 个答案:

答案 0 :(得分:3)

这可能不是那么简单的任务。如果你只有一个$符号,你可以检查注释。如果它们更多,你可以查看下面的例子(它使用lastIdexOf子程序虽然其他方法也是可能的 - 比如用空格替换$并将结果处理为少量字符串):

@echo off
::First way - when you have single '$' or you want to strip the substring before the first one
for /f "tokens=1* delims=$" %%a in ("asd$zxc$qwe") do @echo after the first dollar: %%b


::If you have more '$'-es you need something more complex
setlocal enableDelayedExpansion
set "string=asd$zxc$qwe"
call :lastindexof "%string%" $  lastIndex

set /a lastIndex=lastIndex+1
set noDollars=!string:~%lastIndex%!
echo after the last dollar: %noDollars%
endlocal
goto :eof



:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:lastindexof [%1 - string ; %2 - find last index of ; %3 - if defined will store the result in variable with same name]
::http://ss64.org/viewtopic.php?id=1687
@echo off
setlocal enableDelayedExpansion 


set "str=%~1"
set "splitter=%~2"

set LF=^


rem ** Two empty lines are required
echo off
setlocal
for %%L in ("!LF!") DO (
    for /f "delims=" %%R in ("!splitter!") do ( 
        set "var=!str:%%R=%%L!"
    )
)

for /f  delims^=^" %%P in ("!var!") DO ( 
    set "last_part=%%~P"  
)

if "!last_part!" equ ""  if "%~3" NEQ "" (
 echo "not contained" >2 
 endlocal
 set %~3=-1 
 exit
) else (
 echo "not contained" >2 
 endlocal
 echo -1 
)
setlocal DisableDelayedExpansion

set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n%
      for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
         set "str=A!%%~2!"%\n%
           set "len=0"%\n%
           for /l %%A in (12,-1,0) do (%\n%
             set /a "len|=1<<%%A"%\n%
             for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n%
           )%\n%
           for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n%
      ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=,


%$strlen% strlen,str
%$strlen% plen,last_part
%$strlen% slen,splitter

set /a lio=strlen-plen-slen
endlocal & endlocal & endlocal & if "%~3" NEQ "" (
    set "%~3=%lio%"
) else (
    echo %lio%
)
exit /b 0
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

编辑:这是另一种方法:

@echo off

set "string=asd$zxc$qwe"

for %%a in ("%string:$=" "%") do echo set "result=%%~a"
echo %result%

答案 1 :(得分:3)

鉴于每行只有只有一个'$'字符,并且您只需要字符串 后面的'$'字符,您就可以轻松获得这批代码的结果是:

.carousel

如果您希望将结果存储在日志文件中,则只需添加重定向:

for /f "delims=$ tokens=1*" %%A in (test.txt) do echo %%B

使用tokens参数中的星号,您可以在'$'分隔后获取其余字符串。

答案 2 :(得分:2)

可以使用字符串替换来删除留给$的所有内容和第一个美元符号,并将$之后的所有内容添加到环境变量中,如果整行只包含一个$

@echo off
if exist test.txt (
    set "Line="
    set /P Line=<test.txt
    if defined Line goto ProcessLine
)
set "Line=50-A Description of the item $23"
:ProcessLine
echo on

set "Value=%Line:*$=%"

@echo off
echo Value after first $ is: %Value%
set "Value="
set "Line="

此批处理代码通过输入重定向读取文件test.txt的第一行,如果文件Line存在于当前目录中,并且已发布示例行,则将其分配给环境变量test.txt。否则,使用示例文本定义环境变量Line以演示此方法。

第10行使字符串替换删除第一个$并将所有内容留给它。在命令提示符窗口中运行set /?时,命令 SET 输出的帮助简要解释了这个字符串替换。

环境变量的值通常用%VariableName%引用,这导致在执行命令行之前,在命令行的预处理状态期间被引用的环境变量的当前值替换。

在变量名后面用冒号:指定字符串替换。冒号后面的星号*通知Windows命令解释器,所有直到并包括第一次出现的搜索字符串,紧接着等号=应该被字符串替换等号后,以百分号%表示替换字符串的结尾,另外还有字符串替换。

在这种情况下,搜索字符串只是字符$,替换字符串是空字符串。

批处理文件暂时打开echo模式,以显示整个字符串替换是由Windows命令解释程序cmd.exe在此处执行批处理文件在执行命令行之前已经执行批处理文件完成的,这是为此示例:

set "Value=23"

再次关闭回声模式后的下一行输出:

Value after first $ is: 23

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • goto /?
  • if /?
  • set /?

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解重定向运算符<的说明。

答案 3 :(得分:2)

无论你在行中有多少$,你都可以轻松地在最后一行之后得到文字:

set "str=Te$ting thi$ $cript for $zero"
set "result=%str:$=" & set "result=%"
echo %result%

在这种情况下,您的结果将是zero