代码之家  ›  专栏  ›  技术社区  ›  embWalker

在子字符串后批量修剪文本文件中的行-使用扩展进行REM修剪

  •  2
  • embWalker  · 技术社区  · 7 年前

    我正在使用批处理文件(开放使用VBS和PS1文件)运行Windows 10 Pro,并且我有一个由软件自动导出的文本文件,该文件可以如下所示:

    Sub_Group691_FE7IP11_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project...
    Sub_Group691_FE7IP12_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project...
    Sub_Group691_FE7IP13_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project...
    

    每行在“…”之后继续指定子部分可能包含“有毒”字符。Sub_组部分从文件名中提取,也可以包含“有毒”字符。

    我想做的是只导出文件名,它位于每行的开头,直到并包括第一个文件扩展名,在本例中为“.sldasm”一切都在一审的右边。应修剪sldasm。

    到目前为止,我从Stackoverflow的研究中拼凑出的是:

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "inputfile=C:\Scratch\ASMExport.txt"
    SET "outputfile=C:\Scratch\InputFiles.txt"
    (
     FOR /f "usebackqdelims=" %%a IN ("%inputfile%") DO (
      SET "currentline=%%a"
      ECHO("!currentline:.sldasm=.sldasm & rem "!"
     )
    )>"%outputfile%"
    
    GOTO :EOF
    

    我的问题在于“rem”行,由于处于FOR循环内或需要启用延迟扩展,该行似乎无法按预期工作。它似乎将“rem”解析为文本,这似乎是因为延迟扩展的工作方式。我从以上几行中得到的是:

    SubGroup691_FE7IP11_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem ""
    SubGroup691_FE7IP12_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem ""
    SubGroup691_FE7IP13_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem ""
    

    我可以在循环外使用同一行,而不启用延迟扩展(ENABLEDELAYEDEXPANSION),如下所示:

    @ECHO OFF
    SETLOCAL
    SET "inputstring=Sub_Group691_FE7IP11_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project"
    SET "outputstring=%inputstring:.sldasm=.sldasm & rem "%"
    echo %outputstring%
    

    它的输出将为我提供我想要的:

    Sub_Group691_FE7IP11_2017-12-12.sldasm
    

    在搜索中,我开始认为rem不能以这种方式使用,我必须使用伪定界符转移到令牌定界符循环。

    我会满足于让这项工作,而不用担心文件名中的“有毒”字符,因为我会努力正确命名文件。

    谢谢你的帮助!

    3 回复  |  直到 7 年前
        1
  •  2
  •   aschipfl    7 年前

    这个 & rem 右侧截断字符串的方法无法与 delayed expansion ( ! ),它依赖于正常/即时扩展( % ). 这是因为即时扩展是在命令之前完成的(如 rem )但随后会发生延迟扩展,因此 雷姆 从不执行命令。

    然而,你可以在循环中 replace 每一个 .sldasm 一个被禁止的角色,比如 | 然后用一个 for /F loop ,如下所示:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    set "InputFile=C:\Scratch\ASMExport.txt"
    set "OutputFile=C:\Scratch\InputFiles.txt"
    set "Extension=.sdlasm"
    
    > "%OutputFile%" (
        for /F usebackq^ delims^=^ eol^= %%A in ("%InputFile%") do (
            set "CurrentLine=%%A"
            setlocal EnableDelayedExpansion
            set "CurrentLine=!CurrentLine:%Extension%=|!"
            for /F "delims=|" %%B in ("!CurrentLine!") do (
                endlocal
                echo(%%B
                setlocal EnableDelayedExpansion
            )
            endlocal
        )
    )
    
    endlocal
    exit /B
    

    延迟扩展被切换,因此没有 for 变量在启用时会展开,以避免惊叹号丢失或出现问题。

        2
  •  2
  •   Magoo    7 年前
    @ECHO OFF
    SETLOCAL
    SET "sourcedir=U:\sourcedir"
    SET "filename1=%sourcedir%\q47788829.txt"
    
    FOR /f "usebackqtokens=1delims=/" %%a IN ("%filename1%") DO (
     FOR /f "tokens=1*delims=." %%b IN ("%%a") DO (
      FOR /f "tokens=1*delims=_" %%d IN ("%%c") DO (
    ECHO %%%%-a=%%~a %%%%-b=%%~b %%%%-c=%%~c %%%%-d=%%~d %%%%-e=%%~e ^<^<
      )
     )
    )
    
    GOTO :EOF
    

    您需要更改的设置 sourcedir 适合你的情况。
    我使用了一个名为 q47788829.txt 包含我测试的数据。

    您应该能够从元素中组装所需的报告数据 %%a .. %%e 显示。都是使用问题 tokens delims 建设性地。

        3
  •  -1
  •   Fran Moreno    7 年前

    如果您输入的是您编写的具有相同结构的文本,我认为这一批应该可以工作并快速提取您想要的名称。

    代码 :

    @echo off
    setlocal enabledelayedexpansion
    
    set "inputFile=input.txt"
    set "outputFile=result.txt"
    
    for /f "delims=/ tokens=1" %%A in (%inputFile%) do (
        set "tempFileName=%%A"
        echo !tempFileName:~0,-4!>> %outputFile%
    )
    

    您只需根据需要调整变量“inputFile”和“outputFile”。