String 在子字符串后批量修剪文本文件中的行-REM使用展开进行修剪

String 在子字符串后批量修剪文本文件中的行-REM使用展开进行修剪,string,windows,batch-file,for-loop,trim,String,Windows,Batch File,For Loop,Trim,我正在使用批处理文件(开放使用VBS和PS1文件)运行Windows 10 Pro,我有一个由软件自动导出的文本文件,如下所示: 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-Projec

我正在使用批处理文件(开放使用VBS和PS1文件)运行Windows 10 Pro,我有一个由软件自动导出的文本文件,如下所示:

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...
@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%
每行在“…”之后继续指定子部分,并且可能包含“有毒”字符。子组部分从文件名中提取,也可以包含“有毒”字符

我要做的是只导出每行开头的文件名,直到并包括第一个文件扩展名,在本例中为“.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 ""
我可以在循环外使用同一行,而不启用DelayedExpansion,如下所示:

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...
@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不能以这种方式使用,我必须使用伪定界符转到令牌定界符循环

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

谢谢你的帮助

@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q4778829.txt”
对于(“%filename1%”中的/f“usebackqtokens=1delims=/”%%a,请执行以下操作(
对于/f“tokens=1*delims=。”%%b IN(“%%a”)DO(
对于/f“tokens=1*delims=“%%d IN(“%%c”)DO(

ECHO%%-a=%%~a%%%%-b=%%~b%%%%-c=%%~c%%%%-d=%%~d%%-e=%%~e^右侧截断字符串的
&rem
方法无法使用(
),它依赖于正常/立即扩展(
%
)。这是因为立即扩展是在命令之前完成的(如
rem
)可以识别,但随后会发生延迟扩展,因此永远不会执行
rem
命令

但是,您可以在循环中每隔
.sldasm
使用一个禁止的字符,如
|
,然后将字符串拆分为,如下所示:

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...
@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%
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“InputFile=C:\Scratch\ASMExport.txt”
设置“OutputFile=C:\Scratch\InputFiles.txt”
设置“扩展=.sdlasm”
>%OutputFile%(
对于/F usebackq^delims^=^eol^=%%A in(“%InputFile%”)do(
设置“CurrentLine=%%A”
setlocal EnableDelayedExpansion
设置“CurrentLine=!CurrentLine:%Extension%=|!”
对于(“!CurrentLine!”)中的/F“delims=|”%%B,请执行以下操作(
端部
回声(%%B
setlocal EnableDelayedExpansion
)
端部
)
)
端部
退出/B

延迟扩展是切换的,因此启用时,
变量的
不会被扩展,以避免感叹号丢失或出现问题。

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

代码

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

效果很好,谢谢您,Magoo!这很好,从各个部分重新组装。我将把它拆开,并在每一步进行研究。感谢您对延迟扩展的解释,这真的很有帮助!您的示例正是我所寻找的,并介绍了它对我来说,这是一个新概念(用禁止字符替换搜索字符串)。这就是跳出框框思考。你们这些家伙(和女孩)太棒了!再次感谢你们,aschipfl!