![批处理文件的延迟扩展无法正常工作](https://linux22.com/image/1564630/%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E7%9A%84%E5%BB%B6%E8%BF%9F%E6%89%A9%E5%B1%95%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我编写了这个非常简单的批处理文件,通过按日期将文件移动到文件夹中来组织目录中的文件。因此,最新修改日期为 31-03-2018 的文件将进入文件夹“2018-03-31 - ”。
脚本如下:
@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%a IN (*) DO (
IF NOT "%%a"=="%~nx0" (
FOR %%b IN (%%a) DO (SET FileDate=%%~tb)
SET day=!FileDate:~0,2!
SET month=!FileDate:~3,2!
SET year=!FileDate:~6,4!
SET filename=!year!-!month!-!day! -
IF NOT EXIST "!filename!" (MD "!filename!")
MOVE /-Y "%%a" "!filename!"
)
)
ENDLOCAL
PAUSE
有时候是这样的。看到顶部那个奇怪的文件夹了吗?为什么会发生这种情况。由于我有 EnableDelayedExpansion,所以这种情况不应该发生。
这就是该文件夹里面的内容。就像所有其他文件一样,它们都是普通文件。
有人可以解释一下为什么会发生这种情况并提供解决办法吗?
编辑1:
这是包含 3 个文件的目录的控制台输出:
D:\Leonor\Fotos\Família\2005>´╗┐@ECHO off
'´╗┐@ECHO' is not recognized as an internal or external command,
operable program or batch file.
D:\Leonor\Fotos\Família\2005>SETLOCAL ENABLEDELAYEDEXPANSION
D:\Leonor\Fotos\Família\2005>FOR %a IN (*) DO (
Rem @ECHO %a>test.txt
Rem @ECHO Organizador de Fotos_old.bat>>test.txt
IF NOT "%a" == "Organizador de Fotos_old.bat" (
Rem Se o ficheiro não for este batch...
FOR %b IN (%a) DO (SET FileDate=%~tb )
ECHO !FileDate!
SET day=!FileDate:~0,2!
ECHO !day!
SET month=!FileDate:~3,2!
ECHO !month!
SET year=!FileDate:~6,4!
ECHO !year!
SET filename=!year!-!month!-!day! -
ECHO !filename!
IF NOT EXIST "!filename!" (MD "!filename!" )
Rem MOVE /-Y "%a" "!filename!"
)
)
D:\Leonor\Fotos\Família\2005>(
Rem @ECHO Imagem - Carnaval+Pai Nosso - 2005 001.jpg>test.txt
Rem @ECHO Organizador de Fotos_old.bat>>test.txt
IF NOT "Imagem - Carnaval+Pai Nosso - 2005 001.jpg" == "Organizador de Fotos_old.bat" (
Rem Se o ficheiro não for este batch...
FOR %b IN (Imagem - Carnaval+Pai Nosso - 2005 001.jpg) DO (SET FileDate=%~tb )
ECHO !FileDate!
SET day=!FileDate:~0,2!
ECHO !day!
SET month=!FileDate:~3,2!
ECHO !month!
SET year=!FileDate:~6,4!
ECHO !year!
SET filename=!year!-!month!-!day! -
ECHO !filename!
IF NOT EXIST "!filename!" (MD "!filename!" )
Rem MOVE /-Y "Imagem - Carnaval+Pai Nosso - 2005 001.jpg" "!filename!"
)
)
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
ECHO is on.
~0,2
~3,2
~6,4
~6,4-~3,2-~0,2 -
D:\Leonor\Fotos\Família\2005>(
Rem @ECHO Organizador de Fotos.bat>test.txt
Rem @ECHO Organizador de Fotos_old.bat>>test.txt
IF NOT "Organizador de Fotos.bat" == "Organizador de Fotos_old.bat" (
Rem Se o ficheiro não for este batch...
FOR %b IN (Organizador de Fotos.bat) DO (SET FileDate=%~tb )
ECHO !FileDate!
SET day=!FileDate:~0,2!
ECHO !day!
SET month=!FileDate:~3,2!
ECHO !month!
SET year=!FileDate:~6,4!
ECHO !year!
SET filename=!year!-!month!-!day! -
ECHO !filename!
IF NOT EXIST "!filename!" (MD "!filename!" )
Rem MOVE /-Y "Organizador de Fotos.bat" "!filename!"
)
)
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
D:\Leonor\Fotos\Família\2005>(SET FileDate= )
ECHO is on.
~0,2
~3,2
~6,4
~6,4-~3,2-~0,2 -
D:\Leonor\Fotos\Família\2005>(
Rem @ECHO Organizador de Fotos_old.bat>test.txt
Rem @ECHO Organizador de Fotos_old.bat>>test.txt
IF NOT "Organizador de Fotos_old.bat" == "Organizador de Fotos_old.bat" (
Rem Se o ficheiro não for este batch...
FOR %b IN (Organizador de Fotos_old.bat) DO (SET FileDate=%~tb )
ECHO !FileDate!
SET day=!FileDate:~0,2!
ECHO !day!
SET month=!FileDate:~3,2!
ECHO !month!
SET year=!FileDate:~6,4!
ECHO !year!
SET filename=!year!-!month!-!day! -
ECHO !filename!
IF NOT EXIST "!filename!" (MD "!filename!" )
Rem MOVE /-Y "Organizador de Fotos_old.bat" "!filename!"
)
)
D:\Leonor\Fotos\Família\2005>ENDLOCAL
D:\Leonor\Fotos\Família\2005>PAUSE
Press any key to continue . . .
答案1
我通过将代码更改为来修复它
@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%a IN (*) DO (
IF NOT "%%a"=="%~nx0" (
SET FileDate=%%~ta
SET day=!FileDate:~0,2!
SET month=!FileDate:~3,2!
SET year=!FileDate:~6,4!
SET filename=!year!-!month!-!day! -
IF NOT EXIST "!filename!" (MD "!filename!")
MOVE /-Y "%%a" "!filename!"
)
)
ENDLOCAL
PAUSE
(删除嵌套循环)