子字符串后文本文件中的批处理 Trim 行 - REM Trim 带扩展

Batch Trim Lines in Text File after Sub-String - REM Trim with Expansion

我是 运行 Windows 10 Pro 使用批处理文件(打开使用 VBS 和 PS1 文件)我有一个文本文件自动导出的软件看起来像这样:

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...

每行在“...”之后继续指定子部分,并且可以包含 "poison" 个字符。 Sub_Group 部分是从文件名中提取的,也可以包含 "poison" 个字符。

我要做的是仅导出每行开头的文件名,直到并包括第一个文件扩展名,在本例中为“.sldasm”。应修剪第一个 .sldasm 实例右侧的所有内容。

到目前为止,我通过研究 Whosebug 拼凑的是:

@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,我必须使用伪造的分隔符移动到令牌分隔符循环。

我会满足于让它工作,而不是通过努力正确命名文件来担心文件名中的 "poison" 个字符。

感谢您的帮助!

@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 的文件,其中包含您的数据用于我的测试。

您应该能够 assemble 从显示的元素 %%a..%%e 中获取所需的报告数据。所有问题都是建设性地使用 tokensdelims

向右截断字符串的 & rem 方法不适用于 delayed expansion (!),它依赖于 normal/immediate 扩展 (%) .这是因为立即扩展是在命令(如 rem)被识别之前完成的,但延迟扩展发生在之后,因此永远不会执行 rem 命令。

但是,您可以在循环 replace every .sldasm by a forbidden character like | and then split the string by a 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 变量,以避免感叹号丢失或出现问题。

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

代码:

@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'。