string - 在子字符串之后批量修剪文本文件中的行 - REM 带有扩展的修剪

标签 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 部分是从文件名中提取的,也可以包含“poison”字符。

我想要做的是仅导出位于每行开头的文件名,直到并包括第一个文件扩展名,在本例中为“.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 不能以这种方式使用,并且我必须使用虚假分隔符转移到 token 分隔符循环。

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

感谢您的帮助!

最佳答案

向右截断字符串的 & rem 方法无法与 delayed expansion 一起使用(!),它依赖于正常/立即扩展 (%)。这是因为立即扩展是在命令(例如 rem)被识别之前完成的,但延迟扩展发生在之后,因此 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 变量,以避免感叹号丢失或出现问题。

关于string - 在子字符串之后批量修剪文本文件中的行 - REM 带有扩展的修剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788829/

相关文章:

c++ - 如何初始化一个以字符串为参数的构造函数?

python - 在 Windows 上从 Python 执行 bash 脚本

windows - 如何计算文本文件中的行数并将值存储到使用批处理脚本的变量中?

python - 正在尝试安装 python-docx(错误 : Unable to find vcvarsall. bat)

PHP - 在字符串中间添加字符(从末尾开始)

c++ - 为什么将 char 指针流式传输到 cout 不打印地址?

java - 是否可以将字符串中的文本颜色更改为 Java 中的多种颜色?

c++ - 如何正确离开临界区?

windows - Windows 中的递归删除错误

sql-server - 我可以在一组 Azure 服务器上运行 .bat 文件吗?