Batch file 成批循环输入';文件名_常量.Ext',和打印';文件名';作为输出

Batch file 成批循环输入';文件名_常量.Ext',和打印';文件名';作为输出,batch-file,for-loop,Batch File,For Loop,我在一个目录及其子目录中有一些*.Xml文件。我需要循环遍历XML文件,这些文件的文件名末尾有一个特定的常量,然后回显/打印它们的名称,而不包含常量部分或扩展名(.XML) 例如:以下是我的文件名: FileAAA_Constant.Xml Xml Xml FileDDD_Constant.Xml 这是我需要的输出: FileAAA 归档的 我试过这个命令: For/R%%X in(*\u Constant.Xml)do echo%%~nX 哪个输出: FileAAA\u常数 FileDD

我在一个目录及其子目录中有一些
*.Xml
文件。我需要循环遍历
XML
文件,这些文件的文件名末尾有一个特定的常量,然后回显/打印它们的名称,而不包含常量部分或扩展名(
.XML

例如:以下是我的文件名:

FileAAA_Constant.Xml
Xml
Xml
FileDDD_Constant.Xml
这是我需要的输出:

FileAAA
归档的
我试过这个命令:

For/R%%X in(*\u Constant.Xml)do echo%%~nX
哪个输出:

FileAAA\u常数
FileDDD_常数

如您所见,它只删除了扩展名,而我还需要删除“
\u Constant.Xml

如果知道短语的确切长度,则相当容易;您只需要使用
%var:~0,-3%
语法。由于“
\u Constant
”的长度为9个字符,因此您需要
%var:~0,-9%
,它从开始(
0
)到结束(
-9
)提取文本。另外,延迟变量扩展也必须通过
setlocal ENABLEDELAYEDEXPANSION
启用,才能在
for
循环中运行

下面是一个完整的示例:

@Echo关闭
setlocal ENABLEDELAYEDEXPANSION
对于(*\u Constant.Xml)中的/R%%X,请执行以下操作(
设置FileNameTemp=%%~nX
echo!FileNameTemp:~0,-9!
)
请注意,如果您有一个名为just
\u Constant.xml的文件,这将产生“
ECHO关闭。
”而不是“”(无输出)。这可以通过更改
echo来解决!FileNameTemp:~0,-9
回显!FileNameTemp:~0,-9,但这会在每个输出前放置一个空格


以下是循环:

for/R%%X in(*\u Constant.Xml)do(
设置FileNameTemp=%%~nX
echo!FileNameTemp:~0,-9!
)

如果文件名仅包含一个下划线,则此操作有效,如示例所示:

for /F "delims=_" %%X in ('dir /S /B *_Constant.Xml') do echo %%X

如果所需文件名可能包含多个下划线,请使用Pokechu22的答案。

感谢Pokechu22的回复,我没想到会有这么快的答案!但是,我不认为我可以使用您的命令,因为我所问的只是一个大批处理文件的一小部分,这就是为什么我提供了循环命令,希望有人可以更轻松地修改它,这样我就可以将它添加到批处理中,而不会对其他命令造成问题。顺便说一下,我指的恒定部分是(巧合地)9个字母“\u调整”,但我不知道这是否有帮助。。无论如何,非常感谢你的帮助。。祝你玩得愉快,兄弟:)@KarimAlHousiny这里唯一重要的部分是for循环,我想你可以将它编辑到你的文件中。我已经编辑了我的答案,以包括循环本身;这个可以用吗?非常感谢兄弟。。我已经在我的批处理中测试了您的新命令,它的工作情况与预期的一样好。。再次感谢您的帮助和支持:)实际上所有的文件名都只有一个在_分数以下,所以您的命令非常完美。。。感谢您的帮助:)