这是我第一次在这里发帖,所以如果我做错了,我会道歉。 我需要一个批处理文件或一个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日为止。 任何帮助将不胜感激。
答案 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
"循环中使用的特定字段%%c
和for
"需要%%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