Batch file 基于文件夹';姓名

Batch file 基于文件夹';姓名,batch-file,batch-rename,Batch File,Batch Rename,我有一个包含照片的文件夹,其中包含更多以日期为名称的子文件夹。 例如,它类似于C:\Users\Lorem\Desktop\Photos\22-Dec-98\。 在每个日期文件夹中,我都有简短描述的照片,例如site.png上的第三个早晨,但有些照片可能包含感叹号(!) 通过查看其他问题,我成功地想出了一个程序,在每个简短描述前添加日期,例如18-Jun-98-Weekend campfire.png,这正是我想要的,但当简短描述有一个感叹号时,它无法做到这一点 @echo OFF SET /

我有一个包含照片的文件夹,其中包含更多以日期为名称的子文件夹。 例如,它类似于
C:\Users\Lorem\Desktop\Photos\22-Dec-98\
。 在每个日期文件夹中,我都有简短描述的照片,例如
site.png上的第三个早晨,但有些照片可能包含感叹号(!)

通过查看其他问题,我成功地想出了一个程序,在每个简短描述前添加日期,例如
18-Jun-98-Weekend campfire.png
,这正是我想要的,但当简短描述有一个感叹号时,它无法做到这一点

@echo OFF

SET /P folderPath="Enter full path of the folder which has the files you want to rename: "
PAUSE
SETLOCAL EnableDelayedExpansion
PAUSE
FOR /F "tokens=*" %%G IN ('dir /b %folderPath%') DO (call :subroutine "%%G") 
PAUSE

:subroutine
 set date=%1
 set date=%date:~1,-1%
 set newPath=%folderPath%\%date%\
 FOR /F "tokens=*" %%F IN ('dir /b %folderPath%\%1\') DO (call :rename "%%F")

:rename
 set fileName=%1
 set fileName=%fileName:~1,-1%
 set name=%date%-%fileName%
 set noname=%newPath%%date%
 REN "%noname%" "%name%"
我知道需要输入文件夹位置的方法可能不是最好的选择,但这是我能想到的最好的解决方法。总而言之,我应该在代码中更改/添加哪些内容,以便重命名包含感叹号的文件?如果可能的话,我将非常感谢您对任何更改的解释,因为我对批处理脚本不是很了解;我只改编了不同问题/答案的代码。另外,我真的无法完全理解
%1
%F
的含义或值,因此欢迎链接到教程/简短解释


提前谢谢

乍一看,您必须通过一个
goto:Eof
将子程序与程序流分开。当您调用
Setlocal EnableDelayedExpansion
时,感叹号有一个特殊的含义,用来括住变量。由于不使用此选项,请删除
EnableDelayedExpansion
问题是您已启用延迟扩展,这会消耗感叹号;要解决这个问题,您必须关闭和打开延迟扩展,并仅在实际需要的地方启用它;例如,当您在正常情况下展开变量(如
%fileName%
),或展开变量引用(如
%F
或参数引用(如
%1
)时,请确保禁用延迟展开;实际上我不明白你为什么启用它。。。