我正在努力创建一个满足以下要求的(相当简单的)批处理文件脚本:
- 在名为 Source 的文件夹中查找文件(任意名称 .csv)
- 将文件重命名为 File_YYYYMMDD_HHMinMinSS.csv(如果可能的话,时间戳应该是修改/创建日期(修改/创建应该是同一件事,因此两者都可以)
- 将其移动到名为“目标”的文件夹,以便可以对其进行进一步的操作。
每天创建 1 个文件,因此其中应该只有 1 个,但如果有多个文件(由于某种原因脚本未运行),它应该能够处理多个文件或只选择第一个并正确处理。 (我可以安排它每天运行多次以拾取任何以前未处理的文件。
到目前为止,这是我的代码。我从谷歌上拼凑了它,它在某种程度上可以工作,但并没有达到我想要的效果。
echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%
set stamp=%YYYY%%MM%%DD%_%HH%%Min%%Sec%
move "c:\test\source\*.csv" "c:\test\destination\File_%stamp%.csv"
它找到了正确的文件。它以我想要的格式重命名它(但使用当前日期和时间,不确定如何使用修改或创建日期)并正确移动它。但它只适用于单个文件。如果目录中有多个文件,它会出错,无法将多个文件合并为一个文件(这是有道理的,它无法将所有文件重命名为 1 个文件。
但我被困住了。我不知道该怎么做。有人能帮我吗?我大概知道代码在做什么,但还不足以操纵它做我想要做的事情。
Powershell 也是一个选项,但我对如何在那里操作知之甚少。如果有另一个可以通过任务计划程序轻松安排的选项,那也行。
答案1
这个 powershell 可以满足您的要求。只需将源目录和目标目录的完整路径放在引号之间的顶部即可。
编辑:添加了有关文件创建时间的部分。编辑:添加了命名示例,# 是注释,$name =
一次只能取消注释一个,如果取消注释多个,则最后一个取消注释的注释将生效。
$source = "c:\te\s"
$destination = "c:\te\d"
Get-ChildItem $source -Recurse -Include *.csv | % {
$name = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date -Format hhmmss) + ".csv"
#$name = "Finished_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date -Format hhmmss) + ".csv"
#$name = "Finished_" + $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date -Format hhmmss) + ".csv"
Rename-Item $_ -NewName $name
Move-Item "$($_.Directory)\$name" -Destination $destination
}
顺便说一句,我强烈建议每天留出一点时间来学习 PowerShell,它确实是一个很棒的工具,并且比批处理脚本更加用户友好,作为脚本语言,它易于阅读,主要是因为它几乎是用简单的英语编写的。这是资源中的好资源!:)