子字符串后文本文件中的批处理修剪 - REM修剪扩展

时间:2017-12-13 08:47:01

标签: string windows batch-file for-loop trim

我正在使用批处理文件运行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...

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

我要做的是导出只在每行开头的文件名,直到并包括第一个文件扩展名,在本例中为“.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 个答案:

答案 0 :(得分:2)

@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汇总所需的报告数据。所有这些都是建设性地使用tokensdelims的问题。

答案 1 :(得分:2)

向右截断字符串的& rem方法无法与delayed expansion!)一起使用,它依赖于正常/立即扩展(%)。这是因为在识别命令(如rem)之前立即进行扩展,但之后会发生延迟扩展,因此永远不会执行rem命令。

但是,您可以在每个.sldasm循环replace中使用|之类的禁用字符,然后将字符串拆分为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 :(得分:-1)

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

<强> CODE

@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%
)

您只需调整变量&quot; inputFile&#39;和&#39; outputFile&#39;满足您的需求。