我以为这会很简单但它似乎比我想象的更具挑战性。
我想要复制并粘贴一个文件并附加时间戳。我使用以下代码获取时间戳:
set hournum=%time:~0,2%
if %hournum% gtr 9 (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%h%time:~3,2%m%time:~6,2%s) else (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%h%time:~3,2%m%time:~6,2%s)
Set FileAffected=%1
echo %FileAffected:~0,-1%%timeback%
这将使文件FILE.TXT
成为FILE.TXT_2015-03-05_11h56m32s
但我显然希望如此FILE_20150305_11h56m32s.TXT
文件扩展名可以是任意扩展名或任意长度。感谢您的帮助。
编辑:FileAffected 是带着引号传递的,所以我只是用 ~0,-1 去掉了它们。
我确实发现如果我这样做:
FOR /f %%i IN (%FileAffected%) DO (
ECHO filename=%%~fi
ECHO fileextension=%%~xi
)
如果我回显 FileAffected,我会得到带空格的完整路径名。但是如果我使用 FOR /F 命令,文件名会截断空格后的任何内容。即使在“IN”命令中为“%FileAffected”变量添加额外的引号,仍然无法解决问题,在 fi 或 xi 周围添加引号也无法解决问题。
答案1
如何将日期和时间作为后缀添加到文件名?
使用以下批处理文件:
@echo off
set hournum=%time:~0,2%
if %hournum% gtr 9 (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%h%time:~3,2%m%time:~6,2%s) else (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%h%time:~3,2%m%time:~6,2%s)
echo %~n1%timeback%%~x1
输出:
F:\test>test file.txt
file_3/01_18h07m40s.txt
例如,如果您的文件名包含空格,file with space.txt
那么您需要称呼批处理文件的"
文件名以 s 开头,如下所示:
F:\test>test "file with space.txt"
file with space_3/01_18h07m56s.txt
参数扩展
%~n1
将 %1 扩展为不带文件扩展名的文件名 C:\utils\MyFile,或者如果仅存在路径(没有尾随反斜杠) - 则为该路径中的最后一个文件夹。
%~x1
将 %1 扩展为仅文件扩展名 - .txt
使用“双引号
如果单个参数包含空格,您仍然可以通过用“引号”括起来将其作为一个项目传递 - 这对于长文件名很有效。
如果使用参数来提供这样的文件名:
MyBatch.cmd "C:\Program Files\My Data File.txt"
该参数将是:
%0 = 我的批次
%1 = “C:\Program Files\我的数据文件.txt”
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 参数- 命令行参数(或参数)是传递到批处理脚本的任何值。
- 句法- 转义字符、分隔符和引号。