【问题标题】:Extract only specific string using windows batch script使用 Windows 批处理脚本仅提取特定字符串
【发布时间】:2014-02-15 02:42:13
【问题描述】:

使用 Windows Batch 脚本,我需要如下所示的输出。请帮忙。

输入:

APP "Default Web Site/" (applicationPool:DefaultAppPool)  
APP "Default Web Site/App1" (applicationPool:App1)  
APP "Default Web Site/App1/Pages" (applicationPool:App1)  
App "Site1/App2/" (applicationPool:App2)  
App "Site1/App3/VD1" (applicationPool:VD1)

输出:

Default Web Site  
Site1

【问题讨论】:

  • 输入的哪些部分是固定的,哪些部分是灵活的?你怎么知道,你需要“默认网站”和“Site1”?
  • 我的意图是提取落在“APP”和“之后”的字符串。如果在之间找到一个斜线,那么它应该提取字符串直到“/”而不是“/”

标签: batch-file batch-processing


【解决方案1】:
@echo off
setlocal enableDelayedExpansion
set "val="
for /f tokens^=2^ delims^=/^" %%A in ('sort input.txt') do (
  if "!val!" neq "%%A" echo %%A
  set "val=%%A"
)

万一某个值可能包含!,那么您需要

@echo off
setlocal disableDelayedExpansion
set "val="
for /f tokens^=2^ delims^=/^" %%A in ('sort input.txt') do (
  set "new=%%A"
  setlocal enableDelayedExpansion
  if "!val!" neq "!new!" echo !new!
  endlocal
  set "val=%%A"
)

【讨论】:

    【解决方案2】:
    @echo off
        setlocal enableextensions enabledelayedexpansion
    
        set "inputFile=c:\somewhere\file.dat"
    
        rem Extract the required part of the lines
        set "tempFile=%temp%\%~nx0.%random%.tmp"
        > "%tempFile%" (
            for /f usebackq^ tokens^=2^ delims^=^/^" %%a in ("file.txt") do (echo(%%a)
        )
    
        rem Remove the duplicates from the list
        set "previous="
        for /f "tokens=*" %%f in ('type "%tempFile%" ^| sort') do (
            if not "%%f"=="!previous!" (
                echo(%%f
                set "previous=%%f"
            )
        )
    
        rem Cleanup
        del "%tempFile%" >nul 2>nul
        endlocal
    

    它使用引号和斜线作为分隔符来在所需点上切割线。然后对列表进行排序以消除输出中的重复项

    【讨论】:

      【解决方案3】:
      @echo off
      setlocal
      set "arg_two=%~2"
      for /f "tokens=1 delims=/" %%a in  ("%arg_two%") do echo %%a
      endlocal
      

      测试:

      outputparser.bat APP "Default Web Site/" (applicationPool:DefaultAppPool)
      >Default Web Site
      outputparser.bat App "Site1/App3/VD1" (applicationPool:VD1)
      >Site1
      

      但是,如果您在输入周围设置引号,它将不起作用。

      EDIT 使用要处理的文件(内容与问题中的相同):

      @echo off
      setlocal
      set "file_to_process=.\input_file.txt"
      for /f "usebackq tokens=1 delims=(" %%W in ("%file_to_process%") do (
          for /f usebackq^ tokens^=2^ delims^=/^"  %%a in  ('%%~W') do (
               echo %%a
          )
      )
      endlocal
      

      【讨论】:

      • 您好,输入下的文本将是批处理文件的for语句中使用的输入文件。我希望输出文件显示我在帖子中提到的值。
      【解决方案4】:

      这适用于示例数据。

      @echo off
      (for /f "delims=/" %%a in (file.txt) do (
         for /f "tokens=1,*" %%b in ("%%~a") do (
            echo %%~c
         )
      ))>temp.fil
      
      sort <temp.fil |uniq 
      del temp.fil
      pause
      

      下面的代码是uniq.bat
      将 uniq.bat 放在与上面批处理文件相同的文件夹或路径上的目录中。

      @if (@CodeSection == @Batch) @then
      
      @CScript //nologo //E:JScript "%~F0" & goto :EOF & Rem aacini 2013
      
      @end
      
      var line, prevLine = "";
      while ( ! WScript.Stdin.AtEndOfStream ) {
         line = WScript.Stdin.ReadLine();
         if ( line != prevLine ) {
            WScript.Stdout.WriteLine(line);
            prevLine = line;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多