for循环中的标记和通配符

时间:2017-03-29 14:20:44

标签: batch-file

我正在尝试创建一个名为“index”的txt文件,其中包含一组文件名称列表。文件遵循相同的命名格式:01 - aaa; 02 - bbb; 03 - ccc等,其中字母代表文件的名称。我想创建一个名称如下的txt文件:

AAA

BBB

CCC

即删除垂直列表中的数字,连字符和扩展名,然后我可以将其复制到别处。

这是我到目前为止编写的代码:

@echo off & setlocal EnableDelayedExpansion
for /f "tokens=3* delims= " %%g in ('dir /b /o:n') do (
    if not %%~nxg==index.bat (
        echo %%g >> index.txt
    )
)
endlocal

这正确地循环遍历文件并忽略index.bat(这是我正在运行的文件)但它只输出第三个标记而不是所有后续标记。 *通配符应该表示它输出字符串的其余部分,但它似乎不起作用?

任何其他一般性改进都将受到赞赏 - 只有一周左右的学习批次。

编辑:Magoo和npocmaka的答案在下面解决了它。 %% h包含通配符信息。 "tokens=2* delims= "会将第二个标记分配给%% g,将第三个标记分配给%% h。

工作代码如下:

@echo off & setlocal EnableDelayedExpansion
for /f "tokens=2* delims= " %%g in ('dir /b /o:n') do (
    if not %%~nxg==%%~nx0 (
        set name=%%h
        echo !name:~0,-4! >> index.txt
    )
)
endlocal

if not %%~nxg==%%~nx0从循环中排除批处理文件,set name=%%h创建一个新变量,以便我可以执行子字符串来删除扩展名。 echo !name:~0,-4!是子字符串,它选择除最后4个字符之外的整个字符串,以便排除文件扩展名,然后>> index.txt在同一目录中创建一个只包含所需字符的新文本文件。

2 个答案:

答案 0 :(得分:0)

在您的代码中,%%h将包含该行的其余部分。

tokens=2*包含第3个及以后的代币时,您可以考虑更改为%%h

您可能希望将/a-d添加到dir中,以忽略遇到的任何目录名。

答案 1 :(得分:0)

这对我有用,只需改变:

"tokens=2* delims=-"

如果你只能使用预先安装的应用程序,这是一个很好的PowerShell单线程:

gci C:\folder -Exclude "index" | % {($_ -split "-")[1]} | out-file C:\index.txt

可能需要根据您的需要进行修改。