需要一个批处理文件或一个将占用当前日历月的shell文件,并为每天创建目录。

时间:2014-09-03 00:45:23

标签: windows shell batch-file

这是我第一次在这里发帖,所以如果我做错了,我会道歉。 我需要一个批处理文件或一个shell文件,我可以在月初运行,以便为该月的每一天制作具有以下格式YYYYMMDD的文件夹名称的目录。所以基本上我会有一个名为的文件夹(让我们在这里使用一个例子,然后说出报告。 在报告文件夹中,我需要整个日历月的文件夹20140901 20140902。

到目前为止,我有这段代码:

echo var D = new Date() > tmp.js 
echo D = (D.getFullYear()*100+D.getMonth()+1)*100+D.getDate() >> tmp.js 
echo WScript.Echo( 'set YYYYMMDD='+D ) >> tmp.js 
echo @echo off > tmp.bat 
cscript //nologo tmp.js >> tmp.bat 
call tmp.bat
mkdir %YYYYMMDD%

我知道您也可以根据本地日期创建一个文件夹,但是我不确定告诉它所需的逻辑,直到2014年1月1日为止。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "tokens=1-3delims=./- " %%a IN ("%date%") DO (
 CALL :SETsz yy %%c
 CALL :SETsz mm %%b
)
IF %yy% lss 2000 SET /a yy+=2000
SET cdate=31
FOR %%a IN (2 2 2 4 6 9 11) DO IF %%a==%mm% SET /a cdate-=1
SET /a cdate=((%yy%*100)+%mm%)*100+%cdate%
SET /a yy=%yy% %% 4
IF %yy%%mm%==02 SET /a cdate+=1
FOR /L %%a IN (1%cdate:~-2%,-1,101) DO ECHO(MD reports\!cdate!&SET /a cdate-=1

GOTO :EOF
:setsz
SET cdate=%2
IF %cdate:~0,1%==0 (SET %1=%cdate:~1%) ELSE (SET %1=%2)
GOTO :eof

所需的MD命令仅用于ECHO用于测试目的。 在您确认命令正确之后,将ECHO(MD更改为MD以实际创建目录。附加2>nul以禁止错误消息(例如,当目录已存在时)

这样做更复杂,因为您还没有告诉我们您使用的是哪种特定日期格式。它应该适用于任何分隔符,但我使用我的格式dd/mm/yyyy进行测试。如果使用抑制前导零或两位数年份,它应该按原样运行。

如果您使用领先的日期名称,则需要将tokens更改为2-4以代替1-3。第一个%%b"循环中使用的特定字段%%cfor"需要%%a%%b%%c,具体取决于您在日期格式中使用的顺序。

您可以使用

测试例程
set date=1/02/2012

(例如)在" FOR / f ..."之前的行中。线。通常情况下,我警告我不要试图更改date,因为它是一个"魔术变量"由系统建立并覆盖它可能导致混乱。但是,在这种情况下,它遵循setlocal命令,因此插入的日期覆盖将在例程结束时被撤消;因此在测试过程中它是安全的。

答案 1 :(得分:0)

此代码的前四行将为您提供XP Pro及更高版本中可靠的YY DD MM YYYY HH Min Sec变量。

for循环只会为该年份和月份生成31个文件夹。

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & 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%"

for /L %%a in (1,1,31) do if %%a LSS 10 (md %YYYY%%MM%0%%a) else (md %YYYY%%MM%%%a)
pause

答案 2 :(得分:0)

Magoo你的回答有效。我真的很感激。

这是我最终使用的内容。

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /f "tokens=2-4delims=./- " %%a IN ("%date%") DO (
 CALL :SETsz yy %%c
 CALL :setsz mm %%a
)
IF %yy% lss 2000 SET /a yy+=2000
SET cdate=31
FOR %%a IN (2 2 2 4 6 9 11) DO IF %%a==%mm% SET /a cdate-=1
SET /a cdate=((%yy%*100)+%mm%)*100+%cdate%
SET /a yy=%yy% %% 4
IF %yy%%mm%==02 SET /a cdate+=1
FOR /L %%a IN (1%cdate:~-2%,-1,101) DO MD C:\Users\spoling\Desktop\!cdate!&SET /a cdate-=1

GOTO :EOF
:setsz
SET cdate=%2
IF %cdate:~0,1%==0 (SET %1=%cdate:~1%) ELSE (SET %1=%2)
GOTO :eof