【问题标题】:Tokens and wildcards in for loopsfor 循环中的标记和通配符
【发布时间】:2017-03-29 14:20:44
【问题描述】:

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

啊啊

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 在同一目录中创建一个新的文本文件,其中仅包含所需的字符。

【问题讨论】:

  • * 是一个单独的令牌。你可以试试echo %%g %%h
  • 你应该默认安装powershell,这样会容易很多!
  • @npocmaka 会输出什么。抱歉,今天远离我的电脑,所以无法检查它是如何工作的。 %%h 的值是多少?

标签: batch-file


【解决方案1】:

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

%%h 包含第三个及以后的令牌时,您可能会考虑更改为tokens=2*

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

【讨论】:

  • 如何使用%%h的值?我可以在 for 循环中设置 %%g 来回显它吗?对不起,我知道的基本问题。我还在学习。
  • 语法tokens=3* ... %%g的意思是“将令牌3分配给%%g,将令牌3之后的其余行分配给%%h”如果你使用tokens=1,2,3 ... %%a,那么令牌1分配给@987654330 @、2 到 %%b 和 3 到 %%c%%h 将由您的原始代码建立,因为所选元变量 %%g 具有分配的最低标记编号,然后从标记列表中选择的每个标记按字母顺序分配给下一个元变量。如果可能被误解,令牌列表必须包含一个分隔符,如 ,。例如12* 可能表示 1,2 和 * 或 12 和 ,因此第二个需要 1,2
  • 谢谢,这行得通!以供将来参考和稍后提出此问题的任何人使用,我的工作代码是对上述问题的编辑。
【解决方案2】:

这对我有用,只需更改:

"tokens=2* delims=-"

如果你只能使用预装的应用程序,这是一个不错的 powershell one liner:

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

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

【讨论】:

  • 您可以尝试使用包含多个单词的文件名吗?即文件名“01 - a a a”上的“tokens=3* delims=”。连字符后有多个标记,* 通配符似乎没有为我捕获它们。谢谢。
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多