子字符串后文本文件中的批处理 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
中获取所需的报告数据。所有问题都是建设性地使用 tokens
和 delims
。
向右截断字符串的 & 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'。
我是 运行 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
中获取所需的报告数据。所有问题都是建设性地使用 tokens
和 delims
。
向右截断字符串的 & 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'。