Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file .bat文件将文件名更改为比当前日期短1天_Batch File - Fatal编程技术网

Batch file .bat文件将文件名更改为比当前日期短1天

Batch file .bat文件将文件名更改为比当前日期短1天,batch-file,Batch File,我是一个新手在写脚本,但我知道这是可以做到的,我只是不知道如何 我有一个文件,需要将文件名更改为当前日期减去1个工作日(例如:星期一可追溯到星期五,星期二至星期一,日期前加一个静态“广告” 文件名示例:AD140107.pos (周二改为周三,AD140108.pos) 该文件位于:R:\PortfolioCenter\Output\Manual Interface Files 我在另一个文件夹中有一个类似的文件,该文件的日期格式不同,也需要更改日期 文件名示例:PC010714.slb (周二

我是一个新手在写脚本,但我知道这是可以做到的,我只是不知道如何

我有一个文件,需要将文件名更改为当前日期减去1个工作日(例如:星期一可追溯到星期五,星期二至星期一,日期前加一个静态“广告”

文件名示例:AD140107.pos (周二改为周三,AD140108.pos) 该文件位于:R:\PortfolioCenter\Output\Manual Interface Files

我在另一个文件夹中有一个类似的文件,该文件的日期格式不同,也需要更改日期

文件名示例:PC010714.slb (周二改为周三,PC010814.pos) 此文件位于:R:\slwin\Recon

我想使用相同的脚本更改两个文件名

我知道DOS在工作日做得不好,所以如果需要,我可以使用单独的文件来处理星期一的文件 SETLOCAL 设置“destdir=c:\destdir” 设置“targetdir=c:\destdir” 今天设置=%date:~-2%%日期:~3,2%%日期:~0,2% 对于/f“delims=”(beday.txt)中的%%a,DO SET beday=%%a 如果%Dayed%==%today%GOTO:EOF >昨天.txt回音%今天% ECHO REN“%destdir%\AD%今天%.pos”AD%昨天%.pos 今天设置=%today:~-4%%今天:~0,2% 昨天设置=%昨天:~-4%%昨天:~0,2% ECHO REN“%targetdir%\PC%今天%.slb”PC%昨天%.slb 后藤:EOF 我使用的日期格式是
dd/mm/yyyy
。您的格式可能不同,因此您需要以不同的格式重新格式化日期。基本方法是使用格式为%date:startpos,length%的子字符串将三个元素串在一起,其中位置
0
是(日期)字符串的开始

我将这两个目录命名为
destdir
targetdir
,以适合我的系统

关于把什么名字改成什么名字的问题有些混乱。从当前日期改成前一天的日期似乎更明智,但这不是叙述中所描述的

我假设你每天只运行一次

这一切都是基于将经过按摩的上次跑步日期保存在
beday.txt中,需要首先建立包含一行
140107`或其他内容的日期。如果您仅在周一至周五的午夜自动跑步,则应适当重命名文件


所需的命令仅用于测试目的。验证命令是否正确后,将
ECHO-REN
更改为
REN
,以实际重命名文件。

下面的批处理子例程获取当前日期的周中日期减去一天,并以其参数给定的格式显示:如果是Y,输出格式为YYMMDD,否则为MMDDYY。此例程解决您请求的主要部分

@echo off
setlocal

rem If Format=Y, output is YYMMDD
rem If Format=M, output is MMDDYY

:OneMidweekDayLessCurrentDate format

rem Modify next line accordingly to your locale format (this one use DD/MM/YYYY)
for /F "tokens=1-3 delims=/" %%a in ("%date%") do set /A dd=1%%a-100, mm=1%%b-100, yyyy=%%c

rem Convert the Date minus one day to Julian Day Number, and get its Day Of Week (0=Sunday, ..., 6=Saturday)
set /A a=(mm-14)/12, jdn=(1461*(yyyy+4800+a))/4+(367*(mm-2-12*a))/12-(3*((yyyy+4900+a)/100))/4+dd-32076, dow=jdn%%7

rem If the dow is Sunday or Saturday, change it by the previous Monday
if %dow% equ 0 (
   set /A jdn-=2
) else if %dow% equ 6 (
   set /A jdn-=1
)

rem Convert the Julian Day Number back to date
set /A l=jdn+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447
set /A dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yyyy=100*(n-49)+i+l
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%

rem Show the resulting date
if "%1" equ "Y" (
   echo %yyyy:~-2%%mm%%dd%
) else (
    echo %mm%%dd%%yyyy:~-2%
)
exit /B

另一方面,您没有指定要重命名的文件:“我有一个文件需要更改文件名…文件名示例:AD140107.pos”。如果您指定这一点,我们可以完成解决方案。

这实际上不是重复的,因为它要求前一周(周一至周五),而不考虑周末(周六、周日)在每个位置是否只有一个文件类型?您不希望名称中包含星期一或星期五,但日期格式如图所示,对吗?VBS是否适合您在批处理文件中使用?它内置于Windows中。