这是我第一次真正编辑批处理文件。 请参阅下面的脚本,该脚本将所有文件(第一个文件除外)移动到文件夹。现在我希望将当前月份的所有文件保存在文件夹中,因此不应该循环移动文件。
@Echo Off
SETLOCAL enabledelayedexpansion
SET "sourcedir=D:\ftproot\ftp_db-backup\"
SET /a month=99
SET /a year=99
PUSHD "%sourcedir%"
FOR /f "skip=4tokens=1,2,3,5,*delims=/- " %%a IN (
'dir /tc /a-d /-c /od "*" '
) DO (
IF "%%d"=="" GOTO done
IF %%b-%%c neq !month!-!year! (
ECHO(leave "%%e" "%sourcedir%"
SET month=%%b
SET year=%%c
) ELSE (
//please note I removed the MOVE part here, it should be right here as the echo shows.
ECHO(MOVE "%%e" "D:\ftproot\ftp_db-backup\__REMOVE\" )
)
:done
POPD
GOTO :EOF
我应该添加什么,以及使其工作的正确语法是什么?
我尝试添加IF "%%d"=="08" ECHO(this is current month) ELSE GOTO done
但声称ELSE不正确。
答案 0 :(得分:1)
@ECHO Off
SETLOCAL enabledelayedexpansion
SET "sourcedir=u:\sourcedir"
SET /a month=99
SET /a year=99
PUSHD "%sourcedir%"
FOR /f "skip=4tokens=1,2,3,5,*delims=/- " %%a IN (
'dir /a-d /tc /-c /od "*" '
) DO (
IF "%%d"=="" GOTO done
IF "%%b-%%c" equ "%date:~-7,2%-%date:~-4%" GOTO done
IF %%b-%%c neq !month!-!year! (
ECHO(leave "%%e" ".\x\"
SET month=%%b
SET year=%%c
) ELSE (
ECHO(MOVE "%%e" ".\x\"
)
)
:done
POPD
GOTO :EOF
啊!我最喜欢的 - 或至少其中一个。
接到了使用我的某个软件模块的人的愤怒电话。 “它不起作用”“可能花费我们数百万美元。”是的 - 事实证明他们使用的是由第三方修改过的版本,该版本已经保留了我的版权声明和联系方式,但没有打扰包括关于修改的通知....
然后有一家公司与我打破了他们的商业保密协议,并给了我的竞争对手一份我的软件 - 竞争对手包含在他们自己的软件中而没有归属于版权 - 甚至也不承认。 Fortuantely,他们无法出售任何进一步的软件实施,完全是因为他们无法理解要解决的业务问题。他们更愿意让客户改变他们的商业行为。令人惊讶的是,他们的客户似乎温顺地遵守。经过几年的努力,他们让项目完全放弃 - 毕竟,这是企业主的损失,而不是他们的损失。他们为了理解这个系统而付出了代价(并且失败了),而且老板失去了几十万,这并不是他们的鼻子。
所以我再也没有向客户发布源代码。
至于目前的情况:
echo(
是echo
语句的未记录形式,允许echo(%emptyvalue%
生成空行,而echo %emptyvalue%
将报告echo is on/off
。括号作为part
语句的echo
,并且不参与匹配括号计数。因此else
的问题 - 它跟在一个不是if not
语句的if
部分的点上 - 因为echo(
没有打开带括号的语句序列。 (
是不可见的。
关于简易解决方案,恢复原始版本;所需要的只是新行
IF "%%b-%%c" equ "%date:~-7,2%-%date:~-4%" GOTO done
如果文件的月份等于当前日期的月份,则强制终止例程(因此文件不是move
d)。 /od
上的dir
强制按日期顺序排序,因此第一次在文件列表中找到当前日期必须意味着其余文件也必须具有日期创建的日期当前的月份日期,因此检查它们没有意义 - 它们将被保留。
答案 1 :(得分:0)
@echo off
PUSHD "%sourcedir%"
setlocal enableDelayedExpansion
set "Y="
set "M="
FOR /F "skip=1 tokens=1,2" %%A IN ('WMIC Path Win32_LocalTime Get Year^,Month /Format:table') DO (
if not defined Y set "Y=%%B"
if not defined M set "M=%%A"
)
if %M% lss 10 set M=0%M%
echo current month : %Y%%M%
for %%a in (.) do (
set "drive=%%~da"
set "d_path=%%~fa\"
)
set d_path=%d_path:~2%
set d_path=%d_path:\=\\%
rem wmic datafile where "drive='%drive%' and path like '%d_path%'" get CreationDate,Name
for /f "tokens=* delims=" %%f in ('"wmic datafile where (drive='%drive%' and path like '%d_path%') get CreationDate^,Name"') do (
for /f "tokens=1,2 delims= " %%y in ("%%f") do (
set "file_date=%%y"
set "file_path=%%z"
set file_ym=!file_date:~0,6!
echo the file !file_path! has !file_ym! creation date
if "!file_ym!" NEQ "%Y%%M%" (
MOVE "!file_path!" "D:\ftproot\ftp_db-backup\__REMOVE\"
)
)
)
endlocal