用任何整数扩展名查找名为“Main”的文件的 DOS 搜索模式表达式是啥?

Posted

技术标签:

【中文标题】用任何整数扩展名查找名为“Main”的文件的 DOS 搜索模式表达式是啥?【英文标题】:What is the DOS search pattern expression to find files named "Main" with any integer extension?用任何整数扩展名查找名为“Main”的文件的 DOS 搜索模式表达式是什么? 【发布时间】:2011-10-16 08:09:06 【问题描述】:

我有一个程序生成未知数量的带有整数扩展名的文件,如下所示。

我想将.eps 附加到每个。如何在 DOS 批处理文件中执行此操作?

我无法使用以下内容,因为我不知道搜索表达式。

for %%x in (Main.<what>) do rename "%%x" "%%x.eps"

注意:任何具有相同名称且扩展名为非整数的文件都必须保持原样。

【问题讨论】:

当您说“整数扩展”时,您的意思是 2 位或 4 位数字以及 3 位数字(如图所示),不是吗? @Andriy:分机长度从 3 位 000 到 5 位 99999 不等,但在我的情况下,3 位就足够了。 啊,可惜他们可以补零。那我得想点别的了。 为什么不从001数到99999,检查文件是否存在并重命名? @Fozi:没必要,看我的回答。 【参考方案1】:
setlocal EnableDelayedExpansion
for %%x in (Main.*) do (
    set ext=%%~Xx
    set /a num=!ext:~1!
    if !num! gtr 0 rename "%%x" "%%x.eps"
)

第一个 SET 只获取文件名的扩展名,包括点(带 ~X)。第二个 SET /A 尝试将扩展名(不带 :~1 的点)转换为数字。如果它确实是一个数字(大于零),请重命名。

【讨论】:

以 0 开头的数字可能存在问题。在批处理脚本中,这些数字被认为是八进制的,因此像083097 这样的值会导致SET /A 命令出错。以十进制数字开头但也包含一些字母的值也是如此。命令 shell 会尝试将这样的值视为十六进制,并且如果包含从 AF 范围之外的字母(不区分大小写),则会发生错误。【参考方案2】:

这应该遍历目录。以下是其工作原理的解释:

tokens = 1-2 表示我们只关心文件名的第一部分和第二部分。

delims = . 表示拆分文件名中. 上的标记。

dir /b 表示只列出文件,不显示任何...,通常在dir 命令中显示。您需要将目录放在那里或从同一个文件目录运行。

LSS char 将始终返回GREATER THAN,这就是它的工作原理。我选了9999,你随便选。

最后,它采用文件名的第一部分 (%%A),然后是扩展名 (%%B),然后重命名为文件名的第一部分 (%%A),扩展名为 eps

for /f "tokens=1-2 delims=." %%A in ('dir /b') do if %%B LSS 9999 rename %%A.%%B %%A.%%B.eps

把它放在你的批处理文件中并运行它。

注意:不能重命名为相同的文件名,所以我使用了%%A.%%B.eps

【讨论】:

假设一切正常,如何避免使用非数字扩展名重命名文件? @Carey:数字与它无关。扩展被视为“令牌”,因为我们将分隔符指定为句点,因此它在句点上拆分。我刚刚在这里尝试过,它可以工作。 为第二个 (%%B) 标记添加一个 IF 表达式,就像在上面的答案中它认为它会工作 - 至少它会比我的答案好一点 - 它仍然会重命名星。 00XXX.star (((( OP 说“注意:任何具有相同名称且具有非整数扩展名的文件都必须保持原样。” @Carey:已修复。添加了 IF 语句。

以上是关于用任何整数扩展名查找名为“Main”的文件的 DOS 搜索模式表达式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

哪种编程语言具有扩展名 .do

20160329 -- for/while/do while/goto/ 递归

查找具有特定名称和任何扩展名的文件

如何检查服务器上是不是存在任何pdf文件?

查找和重命名没有扩展名的文件?

如果文件已重命名,如何查找文件扩展名?