首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >批量复制文件,比较文件名中的日期和今天的日期减去X天

批量复制文件,比较文件名中的日期和今天的日期减去X天
EN

Stack Overflow用户
提问于 2017-06-19 20:23:41
回答 3查看 1.6K关注 0票数 0

Dis箝as: Previously我需要比较“上次修改”的日期,但是5分钟前,我得到了一个新的要求,我需要与文件名上的日期进行比较,因为我解释了自己的情况。

假设我有两个文件夹:

  • C:\FolderData (将每天增加新文件)
  • C:\FolderTemp (只需要从执行前一天起就有文件,不包括小时/时间戳)

FolderData将接收文件名,如果不指定日期,该文件名将等于:

  1. SYS_PURCHASES_20170617.xls
  2. SYS_PURCHASES_20170618.xls
  3. SYS_PURCHASES_20170619.xls

如果我今天运行.bat文件,,,我需要只将 SYS_PURCHASES_20170618.xls复制到FolderTemp。这必须通过从文件名(20170618)中获取最后8个字符并检查它是否与TODAYDATE-1匹配来实现。

这在批处理文件中是可能的吗?如果是的话,如何实现?

如果Windows PowerShell(6.1)在以下几个步骤之后也执行了这些步骤,也可以在上接受答案:

  1. 当文件名中的日期= currentdate -1时,将所有文件从folder1复制到folder2;
  2. 从folder2中删除所有文件中的最后9个数字(将删除日期和取消核心"_YYYYMMDD"),因此该文件将是SYS_PURCHASES.xls (需要考虑每个文件扩展名,因为会有.xls、.xlsx和.txt);
  3. 将文件从folder2移动到folder3 (使用简单的move /y) --我相信在执行步骤2时可以这样做,不需要第三个文件夹。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-19 21:12:28

只要脚本不是在闰年的3月1日运行,FolderData中所有与“昨天”对应的最后数字的文件将是

  • 从文件名的最后9位中删除时复制到FolderTemp中
  • 移至Folder3,同时从文件名的最后9位中剥离

我的系统使用DDMMYYYY格式。交换前两个变量的值,将其设置为MMDDYYYY。

代码语言:javascript
运行
复制
setlocal enabledelayedexpansion


set day=%date:~,2%
set month=%date:~3,2%


set year=%date:~-4%
echo.%day%|findstr /r /b "0">nul&&set day=%day:~1%
echo.%month%|findstr /r /b "0">nul&&set month=%month:~1%
set /a day-=5
if %day% lss 1 (
    set /a day+=30
    set /a month-=1
    if !month!==2 (set /a day-=2
                   set /a leap=year%%4
                   if !leap!==0 set day+=1
    )
    for /l %%# in (1 2 7) do if %month%==%%# set /a day+=1
    for %%# in (8 10 12) do if %month%==%%# set /a day+=1
    if !month!==0 (
        set month=12
        set /a year-=1
    )
)
set day=0%day%
set month=0%month%

for %%# in (C:\FolderData\*) do (
    set name=%%~n#
    if "!name:~-8!"=="%year%%month:~-2%%day:~-2%" (
        copy "%%#" "C:\FolderTemp\!name:~,-9!%%~x#"
    )
)

如果我误解了什么,请告诉我。

编辑:修改了脚本,以说明可以追溯到多天前。

票数 1
EN

Stack Overflow用户

发布于 2017-06-19 23:16:27

使用下面的powershell脚本folder2是不必要的,您没有命名folder3,所以请根据您的环境进行调整。

代码语言:javascript
运行
复制
$Folder1 = "C:\Test\2017\06\20"
$Folder3 = "C:\Test\2017\06\20\Destination"

$YesterDay = (Get-Date).AddDays(-1).ToString('yyyyMMdd')

Get-ChildItem -Path $Folder1 -Filter "SYS_PURCHASES_$YesterDay.*"|Where{ !$_.PSisContainer}|
  Copy-Item -Destination {Join-Path $Folder3 (($($_.BaseName) -replace '_\d{8}$')+$_.Extension)} -whatif

上述脚本的原始输出仅插入行中断

代码语言:javascript
运行
复制
PS C:\test\2017\06\20> ls
    Directory: C:\test\2017\06\20

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       06/20/2017     18:13                Destination
-a----       06/20/2017     18:01           1044 SO_44639321.ps1
-a----       06/20/2017     00:56             24 SYS_PURCHASES_20170617.xls
-a----       06/20/2017     00:56             24 SYS_PURCHASES_20170618.xls
-a----       06/20/2017     01:07             24 SYS_PURCHASES_20170619.txt
-a----       06/20/2017     00:56             24 SYS_PURCHASES_20170619.xls

PS C:\test\2017\06\20> .\SO_44639321.ps1
What if: Performing the operation "Copy File" on target 
"Item: C:\Test\2017\06\20\SYS_PURCHASES_20170619.txt Destination: C:\Test\2017\06\20\Destination\SYS_PURCHASES.txt".
What if: Performing the operation "Copy File" on target 
"Item: C:\Test\2017\06\20\SYS_PURCHASES_20170619.xls Destination: C:\Test\2017\06\20\Destination\SYS_PURCHASES.xls".
PS C:\test\2017\06\20> type .\SO_44639321.ps1

如果输出在您的系统上看起来是对的,请删除最后一行末尾的-whatif参数。

票数 1
EN

Stack Overflow用户

发布于 2017-06-20 16:59:55

一种组合批处理/PowerShell方法。

用于日期计算的Powershell和其余的纯批处理

代码语言:javascript
运行
复制
@Echo Off&Setlocal EnableDelayedExpansion
Set "Folder1=C:\Test\2017\06\20"
Set "Folder3=C:\Test\2017\06\20\Destination"

For /f "usebackq delims=" %%A in (
  `Powershell -NonI -Nop -Com "(Get-Date).AddDays(-1).ToString('yyyyMMdd')"`
) Do Set YesterDay=%%A

For /F "Delims=" %%A in (
  'Dir /B/A-D "%Folder1%\*_%YesterDay%.*" '
) Do (
  Set "File=%%~nA"
  Set "File=!File:_%YesterDay%=!"
  Echo Copy "%%~fA" "%Folder3%\!File!%%~xA"
)

样本输出

代码语言:javascript
运行
复制
> SO_44639321.cmd
Copy "C:\Test\2017\06\20\SYS_PURCHASES_20170619.txt" "C:\Test\2017\06\20\Destination\SYS_PURCHASES.txt"
Copy "C:\Test\2017\06\20\SYS_PURCHASES_20170619.xls" "C:\Test\2017\06\20\Destination\SYS_PURCHASES.xls"

如果输出看起来没有问题,请删除复制前面的回波。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44639321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档