我正在使用批处理文件运行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不能以这种方式使用,我必须使用伪定界符移动到令牌定界符循环。
我会满足于让这个工作,而不是担心文件名中的“毒药”字符,因为他们正在努力正确地命名文件。
感谢您的帮助!
答案 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
汇总所需的报告数据。所有这些都是建设性地使用tokens
和delims
的问题。
答案 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;满足您的需求。