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