Batch file 将文件作为.bat文件从一个文件夹移动到另一个文件夹并重命名,并在开始处添加修改日期

Batch file 将文件作为.bat文件从一个文件夹移动到另一个文件夹并重命名,并在开始处添加修改日期,batch-file,rename,move,last-modified,Batch File,Rename,Move,Last Modified,我花了很多时间试图解决这个问题,但没有运气 情景: 文件夹中有多个不同的文件名,但扩展名相同。在Windows server 2008上,64位。 要使用计划批处理作业将它们移动到另一个文件夹。蝙蝠。在移动过程中,我想将它们重命名,以包括上次修改的日期。我试图将以下内容转换为以下格式: yyyymmddhhmmss-name.zip 我在PowerShell和中查看了命令,但还是无法解决 我找到了这段三行代码,它在Windows7上运行良好,但在WindowsServer2008上运行不好 @

我花了很多时间试图解决这个问题,但没有运气

情景: 文件夹中有多个不同的文件名,但扩展名相同。在Windows server 2008上,64位。 要使用计划批处理作业将它们移动到另一个文件夹。蝙蝠。在移动过程中,我想将它们重命名,以包括上次修改的日期。我试图将以下内容转换为以下格式:

yyyymmddhhmmss-name.zip
我在PowerShell和
中查看了
命令,但还是无法解决

我找到了这段三行代码,它在Windows7上运行良好,但在WindowsServer2008上运行不好

@echo off
set Date=%date:~10,4%%date:~4,2%%date:~7,2%
move d:\Test\*.zip d:\Test1\*%Date%.zip
在服务器上,它无法理解
*%Date%
。我一删除
*
,它就工作了。我尝试过引用不同的变体,但不起作用。我知道日期不是我想要的解决方案,但如果我不能让这条简单的线路正常工作,那么其余的就不重要了

哦,偏移量确实起作用了,所以我得到了显示日期
yyyymmdd
。 我避免使用PowerShell,因为我不擅长使用它,而且我还研究了VBS。但这不是优点。有人能帮忙吗


我知道有很多问题都是类似的,但没有什么与我想做的完全匹配。

您可以通过使用
wmic
命令来实现这一点。这允许您获取当前日期和时间,而不受区域设置的影响。同时,它还将帮助您重命名zip文件

@echo off
SETLOCAL EnableDelayedExpansion

for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
    IF NOT "%%~f"=="" (
        set /a FormattedDate=10000 * %%f + 100 * %%d + %%a
        set /a FormattedTime=%%b * 10000 + %%c * 100 + %%e
    )
)

for /f %%f in ("D:\Test*.zip") DO set filename=%%~nf

move "D:\Test*.zip" "D:\%FormattedDate%%FormattedTime%-%filename%.zip"

希望这能有所帮助。

您可以通过使用
wmic
命令来实现这一点。这允许您获取当前日期和时间,而不受区域设置的影响。同时,它还将帮助您重命名zip文件

@echo off
SETLOCAL EnableDelayedExpansion

for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
    IF NOT "%%~f"=="" (
        set /a FormattedDate=10000 * %%f + 100 * %%d + %%a
        set /a FormattedTime=%%b * 10000 + %%c * 100 + %%e
    )
)

for /f %%f in ("D:\Test*.zip") DO set filename=%%~nf

move "D:\Test*.zip" "D:\%FormattedDate%%FormattedTime%-%filename%.zip"

希望这有帮助。

您可以使用
FOR
循环,并将
~t
修饰符应用于循环变量,以访问每个文件的上次修改时间戳。在实际使用
MOVE
命令之前,需要将原始时间戳值调整为必要的格式。下面是一个如何做到这一点的示例:

@ECHO OFF
FOR %%I IN ("D:\Test\*.zip") DO (
  SET lmdate=%%~tI
  SETLOCAL EnableDelayedExpansion
  SET lmdate=!lmdate:~6,4!!lmdate:~3,2!!lmdate:~0,2!!lmdate:~11,2!!lmdate:~14,2!
  MOVE "%%I" "D:\Test1\!lmdate!-%%~nxI"
  ENDLOCAL
)
需要注意的是,使用
~t
修饰符的循环变量返回的时间戳的精度限制为分钟,因此,如果您真的需要秒,正如您的帖子所建议的,这可能不是您的解决方案

无论如何,这就是脚本的工作原理

在每次迭代中,
%%I
循环变量被分配一个文件名。
~t
修饰符指示变量解析为相应文件的上次修改时间戳

首先用
%%~tI
返回的时间戳初始化
lmdate
变量(第一条
SET-lmdate
语句),然后重新排列该值以适应
yyyyMMddHHmm
格式(第二条
SET-lmdate
语句)。请注意,由于原始时间戳的格式取决于系统的区域设置,因此可能需要修改第二个SET语句以适应特定的系统。上述脚本采用以下格式:

dd.MM.yyyy HH:mm
访问循环体中的实际
lmdate
值时,需要上面也可以看到的
SETLOCAL EnableDelayedExplansion
语句。如果您不知道,则在同一命令块中设置和检索值时,块命令中环境变量的“正常”(
%
)扩展不起作用。这就是延迟扩张派上用场的地方。首先需要启用它,然后使用不同的扩展语法(
s而不是
%


您可以看到脚本中使用的其他修饰符,即
~n
~x
~nx
一起使用时)。前者只解析为文件名(没有路径或扩展名),后者只解析为扩展名。还有其他修改器,它们记录在
FOR
命令的内置帮助(
FOR/?
)中。

您可以使用
FOR
循环,并将
~t
修改器应用于循环变量,以访问每个文件的上次修改时间戳。在实际使用
MOVE
命令之前,需要将原始时间戳值调整为必要的格式。下面是一个如何做到这一点的示例:

@ECHO OFF
FOR %%I IN ("D:\Test\*.zip") DO (
  SET lmdate=%%~tI
  SETLOCAL EnableDelayedExpansion
  SET lmdate=!lmdate:~6,4!!lmdate:~3,2!!lmdate:~0,2!!lmdate:~11,2!!lmdate:~14,2!
  MOVE "%%I" "D:\Test1\!lmdate!-%%~nxI"
  ENDLOCAL
)
需要注意的是,使用
~t
修饰符的循环变量返回的时间戳的精度限制为分钟,因此,如果您真的需要秒,正如您的帖子所建议的,这可能不是您的解决方案

无论如何,这就是脚本的工作原理

在每次迭代中,
%%I
循环变量被分配一个文件名。
~t
修饰符指示变量解析为相应文件的上次修改时间戳

首先用
%%~tI
返回的时间戳初始化
lmdate
变量(第一条
SET-lmdate
语句),然后重新排列该值以适应
yyyyMMddHHmm
格式(第二条
SET-lmdate
语句)。请注意,由于原始时间戳的格式取决于系统的区域设置,因此可能需要修改第二个SET语句以适应特定的系统。上述脚本采用以下格式:

dd.MM.yyyy HH:mm
访问循环体中的实际
lmdate
值时,需要上面也可以看到的
SETLOCAL EnableDelayedExplansion
语句。如果您不知道,则在同一命令块中设置和检索值时,块命令中环境变量的“正常”(
%
)扩展不起作用。这就是延迟扩张派上用场的地方。首先需要启用它,然后使用不同的扩展语法(
s而不是
%

您可以看到脚本中使用的其他修饰符,即
~n
~x
~nx