2017-06-19 91 views
-1

Disclamer:Previously我需要比较来自“上次修改”,但5分钟前我得到了一个新的要求,我需要与日期比较日期文件名,我解释自己的吼叫。批量复制文件的文件名与今天日期减去X天比较日期

想象一下,我有2个文件夹:

  • 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。这必须通过从文件名()获得最后8个字符并且检查其是否与TODAYDATE - 1匹配来完成。

这是可能的批处理文件,如果是这样,如何?

同样在Windows PowerShell(6.1)接受的答案,如果它也确实经过这些步骤:

  1. 复制从folder1中的所有文件,文件夹2时,在文件名的日期=的currentdate - 1;
  2. 所有文件从文件夹2删除最后一个9个位数(将删除的日期和undescore“_YYYYMMDD”),因此该文件将SYS_PURCHASES.xls(需要考虑所有的文件扩展名,一样会有的.xls,.XLSX和。文本);
  3. 移动,并从文件夹2替换文件folder3(使用简单move /y) - 我相信这是可能做到这一点,在做第2步,无需要一个第三个文件夹。
+2

你写了什么代码了吗?你可以请包括它吗? – sodawillow

+0

日期前的文件名部分是否始终相同? – aschipfl

+0

@sodawillow,我有一些被aschipfl替代的东西在** DISCLAMER **链接提供了我的答案。所以我需要替换FOR内部的东西并保持DO。 – mrbTT

回答

1

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

  • 复制到FolderTemp而从文件的最后9位被剥夺命名
  • 移到Folder3而从文件名

我的系统使用DDMMYYYY格式的最后9位被剥夺。交换前两个变量的值以将其设置为MMDDYYYY。

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#" 
    ) 
) 

请告诉我,如果我误解了一些东西。

编辑:修改脚本以说明返回多个日期。

+0

谢谢,我会调整它到我的代码,看看它是否工作。删除最后9个字符只需要进行一次。由于复制是在FOR/DO中完成的,因此似乎不需要第三个文件夹。闰年可能会成为问题 – mrbTT

+0

编辑我的脚本以计算闰年(模数为4,如果0表示闰年)。 – Regejok

+0

你好,代码几乎是完美的,但当我们在月初时它不工作。我将PC的日期更改为20160302,将该变量更改为'set/a day- = 2',并且还移动了set/a month- = 1'up,并试图用20160229复制文件。运行脚本, '如果%month%== 2'回显'if 3 == 2'.BTW,你可以做得很干净,以便获得31天的月份。 – mrbTT

1

以下PowerShell脚本文件夹2不是必需的, 您没有命名文件夹3 - 因此适应您的环境。

$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 

以上脚本的原始输出只有换行符插入

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参数在最后一行的末尾。

+0

谢谢,这看起来好像会起作用,但我无法对'SYS_PURCHASES_'进行硬编码,因为会有其他系统的文件(例如'SYS_BUYS','SYS_INVESTMENTS','ADM_MADEUP_DIFF_THING'等等)。考虑日期的所有文件的循环(所有文件都将具有相同的格式_YYYYMMDD) – mrbTT

+0

这是没有问题的我想尽可能精确地选择,如果名称中的常量是尾部下划线和日期,我可以简单地替换'SYS_PURCHASES'带星号作为通配符(这与您问题中的要求不同) – LotPings

+0

您好,必须删除'-File',因为Windows PowerShell指出它并未将其识别为参数。得到复制,但最终没有移除_YYYYMMDD,试图修复它。 – mrbTT

0

一种组合的批量/ PowerShell方法。

PowerShell执行之日起计算和纯批次其余

@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" 
) 

样本输出

> 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" 

如果输出看起来OK中的回声中的副本面前。