在CMD中使用文件的日期重命名文件

6

我觉得自己承担的任务太多了。

我是明尼苏达州法院系统的一名法庭记录员。我们制定了一个新的政策,用于提交我们的电子笔记,因为许多记录员不再打印纸质笔记。不同品牌的记录机器创建的文件具有不同的命名约定,我们希望标准化名称,以便在我们不在场时,地区管理人员可以轻松找到正确的笔记。

因此,我们想将FILE.001、FILE.002和20151018-082815.sgstn等文件重命名为创建文件的日期。当然,sgstn文件具有唯一的名称,但创造FILE.*文件的普及作者确实需要重命名,标准化将有助于所有人。我正在创建一个CMD文件,还会查询法官的姓名和作者品牌,以便从存储中取出笔记的任何人都能找到他们要寻找的内容:“2015-10-18 Jones法官,Stentura作者.001”

我已经找到了许多重命名具有今天日期和时间的文件的解决方案,但我们想使用它们自己的日期和时间来重命名它们。

我在Windows 7 Pro中作为标准用户工作,没有安装第三方软件的选项。Windows允许个人用户设置其首选日期样式,dbenham和其他人在此处向我展示了如何从注册表中获取该样式:

:: For REG.EXE 3.0 (Windows XP) and later versions
FOR /F "tokens=3" %%A IN (
  'REG QUERY "HKCU\Control Panel\International" /v sShortDate'
  ) DO (SET sShortDate=%%A)
Echo %sShortDate%

这将返回用户选择的yyyy-MM-dd或d-M-yy等格式。

然后,我可以测试不同字符串部分的内容:

for /f "tokens=1,2,3 delims=/-" %%A in ("%sShortDate%") do (
    for /f "tokens=1" %%D in ("%%A") do (
        set Part1=%%D
    )
    for /f "tokens=1" %%D in ("%%B") do (
        set Part2=%%D
    )
    for /f "tokens=1" %%D in ("%%C") do (
        set Part3=%%D
    )
)
echo Part1 = %Part1%
echo Part2 = %Part2%
echo Part3 = %Part3%

但是这已经变得非常笨重了,我已经阅读了整整24小时,包括这里和其他地方的内容,仍然只完成了一半。在Windows中真的没有办法,无论是在CMD提示符中还是在任何可用于命令行的工具中,以可预测的格式获取文件的日期并使用该日期吗?
有人可以同情我,并为我们提供更简便的方法来找出用户特定系统认为应该格式化日期的方式,并因此一致地重命名所有放在CMD快捷方式上的文件吗?
最后,这是我在这里发布的第一个帖子。欢迎进行所有建设性的批评。
-- Timothy J. McGowan
编辑以添加: 也许我想太多了。我正在轮询注册表中的用户Hive以获取日期格式。我们应该能够从命令行写入自己的 Hive,对吗?
所以我可以读取用户首选日期格式,将其保存到变量中,强制使用我想要使用的日期格式,处理文件,然后重置用户的日期格式。对吗?值得一试。
如果它有效,我会回报的,但是任何其他评论都非常受欢迎!

如果有可能的话,用VBScript或PowerShell或者任何实际编程语言实现会更可靠。虽然你可以在批处理中做很多事情,但它并不是专门为此设计的。(我特别建议使用VBScript和PowerShell,因为它们内置于Windows系统中。) - Harry Johnston
谢谢,哈里。我还没有学习VBScript或PowerShell。我精通PerfectScript,但我从未使用过Word,只用过WordPerfect。而且我怀疑我无法说服整个政府机构使用不同的文字处理软件。 :) - Timothy J. McGowan
2个回答

1

一个初步的想法:

使用分隔符获取文件的日期、名称或扩展名

@echo off

setlocal enabledelayedexpansion

for %%a in (*.*) do (
  set "$FileName=%%~na"
  set "$FileExtension=%%~xa"
  set "$FileDate=%%~ta"
  set "$FileDate=!$FileDate:/=-!"
  echo !$FileDate!-!$FileName!!$FileExtension!)

获取日期的 YYYY-MM-DD 格式:
@echo off

setlocal enabledelayedexpansion

for %%a in (*.*) do (
  set "$FileName=%%~na"
  set "$FileExtension=%%~xa"
  set "$FileDate=%%~ta"
  set "$FileDate=!$FileDate:/=-!"
  set "$FileDate=!$FileDate:~6,4!-!$FileDate:~3,2!-!$FileDate:~0,2!"
  echo !$FileDate!-!$FileName!!$FileExtension!)

谢谢,SachaDee。我接下来就要去那里了。哎呀,不知道按回车键会发送消息。 - Timothy J. McGowan
我不在场时他们解释了美元符号。我在FOR帮助下没有看到它。我接下来会尝试SetLocal。问题在于,作为一个实验,我将系统日期设置为显示为d-M-yy。这使得今天是18-10-15。有点混乱,但我是故意夸大其词的。我通常使用yyyy-MM-dd,但大多数人使用dd-MM-yyyy。因此,我需要解析当前用户的注册表,找出年、月和日在他们的设置中的位置,然后将文件重命名为yyyy-MM-dd加上剩余部分。 - Timothy J. McGowan
@TimothyJ.McGowan - 这里的美元符号没有意义,只是变量名的一部分。 - SomethingDark

0
也许这不是我所问问题的完整答案,但这应该足以让我得到一个可预测的日期。
可以从注册表中保存用户喜欢的日期格式,强制使用你想要的日期格式,完成业务后再返回用户喜欢的日期格式(假设他们没有在运行过程中取消批处理文件)。
输出结果很混乱,但它只是证明了这个概念是可行的。
@echo off
:: replace and then restore date style in Windows registry.

:: find current date style; save to environment variable OriginalsShortDate
FOR /F "tokens=3" %%A IN (
  'REG QUERY "HKCU\Control Panel\International" /v sShortDate'
  ) DO SET OriginalsShortDate=%%A

:: display current date style as reflected by date of this CMD/BAT file
echo Current date style to be saved:  %OriginalsShortDate%
echo Looks like this:
dir %0
echo Press any key to set yyyy-MM-dd date style
pause

:: force preferred date style and hide success message
reg add "HKCU\Control Panel\International" /v sShortDate /d yyyy-MM-dd /f >nul

:: prove it's changed
:: //////////// here's where you do your business \\\\\\\\\\\\
echo Check file's date now.
dir %0
echo (Your Windows task bar may not reflect change immediately.)
echo.
echo Press any key to set MM-dd-yy date style
pause

:: force next style
reg add "HKCU\Control Panel\International" /v sShortDate /d MM-dd-yy /f >nul

:: prove it's changed
echo Check file's date now; it will be in MM-dd-yy format.
dir %0
echo Press any key to return date format to your preferred style.
pause

:: return to user's original setting
reg add "HKCU\Control Panel\International" /v sShortDate /d %OriginalsShortDate% /f >nul

:: prove it's back to normal
dir %0
echo Your original, presumably preferred, date style has been reset.
echo Give your Windows task bar some time to update.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接