如何在CMD中用新字符(23)替换两个特定字符(22,去年的文件夹结构)?

问题描述 投票:0回答:1

在 Windows CMD 上工作,是否有通配符或其他运算符可以在所有子文件夹中查找并用“23”替换“22”?我复制了 2022 年的文件夹结构,并希望将所有复制的文件夹重命名为 2023 年。

我有下面的目录列表。

     Directory of c:\cmdTest

09/29/2022  10:46 AM    <DIR>          .
09/29/2022  10:46 AM    <DIR>          ..
09/29/2022  10:46 AM    <DIR>          22
09/29/2022  10:30 AM    <DIR>          asdfsdf22
09/29/2022  10:30 AM    <DIR>          asdhfigh22
09/29/2022  10:30 AM    <DIR>          rheht22
09/29/2022  10:30 AM    <DIR>          sadfjksadfjk22
               0 File(s)              0 bytes
               7 Dir(s)  582,340,362,240 bytes free

并且可以一次更改一个:

c:\cmdTest>ren 22 23

但无法找到一种方法来立即改变所有这些。我尝试过以下的变体,但被难住了。

c:\cmdTest>ren *22 "23"
The syntax of the command is incorrect.

c:\cmdTest>ren "%22%" "23"
The system cannot find the file specified.

c:\cmdTest>ren *22 23
The syntax of the command is incorrect.
batch-file cmd rename wildcard
1个回答
1
投票

一种仅适用于不包含一个或多个感叹号的文件夹名称的批处理文件解决方案是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *22 /AD-L /B 2^>nul') do (
    set "FolderName=%%I"
    ren "!FolderName!" "!FolderName:~0,-1!3"
)
endlocal

命令 FOR 在后台启动另一个命令进程,并使用选项

/c
来执行
'
中指定的命令行。因此,Windows 安装在后台执行
C:\Windows
:

C:\Windows\System32\cmd.exe /c dir *22 /AD-L /B 2>nul

命令DIR搜索

  • 当前目录下
  • 仅适用于由于选项
    /AD-L
    而忽略连接(硬链接)和符号链接的目录(属性目录而不是链接)
  • 其中名称与通配符模式匹配
    *22
  • 并且由于选项
    /B
    (裸格式)而仅输出不带路径的目录名称。

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
的说明。重定向运算符
>
必须在
FOR
命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的
dir
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程。

目录名称的输出列表是通过处理批处理文件捕获的,并在后台启动后逐行处理

cmd.exe
自行关闭。

FOR

与选项 cmd.exe 忽略此处不出现的始终空行。默认情况下,使用普通空格和水平制表符作为分隔符将每行拆分为子字符串(标记),并且如果第一个子字符串不是以以下开头,则仅将第一个空格/制表符分隔的字符串分配给指定的循环变量

/F
分号是默认的行结束符,也会导致忽略该行。选项
I
定义了一个空的分隔符列表,从而关闭行分割行为。选项
delims=
将竖线定义为行尾字符,任何目录名称都不能包含该字符,因此即使名称开头带有
eol=|
的目录也会由
FOR
处理。还可以使用 ;
eol=*
,这在目录/文件名中也是不可能的。
文件夹名称被分配给一个环境变量,该环境变量在命令行上通过延迟扩展来引用,以使用当前文件夹名称作为新文件夹名称重命名文件夹,最后一个字符 

eol=?

除外,并附加字符

2
作为替换对于角色
3
。也可以使用
2
更改最后两个字符(年份)。
如果任何目录名称中包含一个或多个 

"!FolderName:~0,-2!23"

,则此批处理文件不起作用,因为永久启用延迟扩展会导致命令行

!
在用目录名称替换
set "FolderName=%%I"
后被
cmd.exe
第二次解析当前分配给循环变量
%%I
并将目录名称中的感叹号解释为延迟扩展环境变量引用的开始/结束,而不是将目录名称中的感叹号解释为文字字符。
重命名正确的包含一个或多个感叹号的目录的解决方案是:

I

由于在循环中使用命令 
SETLOCAL

ENDLOCAL,始终有效的解决方案速度较慢。有关命令 SETLOCALENDLOCAL 的详细信息,请阅读此答案。但用户不会注意到完成一小部分文件夹的文件夹重命名任务所需的时间差异,因为现在的处理器非常快。 要了解所使用的命令及其工作原理,请打开

命令提示符

窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

    @echo off setlocal EnableExtensions DisableDelayedExpansion for /F "eol=| delims=" %%I in ('dir *22 /AD-L /B 2^>nul') do ( set "FolderName=%%I" setlocal EnableDelayedExpansion ren "!FolderName!" "!FolderName:~0,-2!23" endlocal ) endlocal
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • ren /?
  • set /?
  • 
        
© www.soinside.com 2019 - 2024. All rights reserved.