批处理文件(ForFiles 逻辑的多个条件命令)?
Batch file (ForFiles multiple conditional commands for logic)?
我刚刚进入 Bat 文件。
我正在尝试删除网络共享驱动器上的旧文件夹,但按名称跳过了其中的 2 个文件夹。
基本上我需要我每天制作的所有文件并始终保留 2 个旧文件。
删除所有超过 3 天的文件的代码:
PushD "\****-****\build" &&(
ForFiles /D -3 /C "CMD /C if @ISDIR==TRUE echo RD @FILE &RD /S @FILE
) & PopD
我在想这样的事情:if NOT @FNAME == %name%。我不完全理解这个过程,我可以在 forFiles 中有两个条件吗?我之前必须有 /c 吗?
PushD "\****-****\build" &&(
ForFiles /D -3 /C "CMD /C if NOT @FNAME == %name% if @ISDIR==TRUE echo RD @FILE &RD /S @FILE
) & PopD
我好像不明白,你介意帮帮我吗?
谢谢!
有点乱,但我可以在本地目录上完成:
@echo off
mkdir Temp\Temp
REM Copy all old file to Temp dir
forfiles -p "%cd%" -m *.* /D -2 /C "cmd /c xcopy @path %cd%\Temp"
REM copy a random file from Temp dir to Temp/Temp dir and then delete it
FOR %%A in (%cd%\Temp\*) do (
COPY "%%A" %cd%\Temp\Temp\
DEL "%%A"
GOTO :Second
)
:Second
Rem copy second random file from Temp dir
FOR %%A in (%cd%\Temp\*) do (
COPY "%%A" %cd%\Temp\Temp\
GOTO :Del
)
:Del
Rem delete all old files from local dir
forfiles -p "%cd%" -m *.* /D -2 /C "cmd /c del @path"
Rem Copy back two random old files to local dir
xcopy %cd%\Temp\Temp\* %cd%
Rem remove Temp dir
rmdir /s /q Temp
是的,在它们的 then 分支中嵌套 if
命令是具有逻辑 AND
的方法。请注意下一个代码片段中的正确引用:
@ECHO ON >NUL
@SETLOCAL enableextensions
set "name=SO"
set "nam2=SU"
pushd "D:\VB_scripts"
@rem all directories
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE echo @FILE"
@rem all directories except "SO"
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""%name%""" echo @FILE"
@rem all directories except "SO" and "SU"
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""%name%""" if not @FNAME=="""%nam2%""" echo @FILE"
popd
@ENDLOCAL
输出:
==>D:\bat\SO346676.bat
==>set "name=SO"
==>set "nam2=SU"
==>pushd "D:\VB_scripts"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE echo @FILE"
"Class Pack"
"Oldies"
"SO"
"SU"
"WMI"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""SO""" echo @FILE"
"Class Pack"
"Oldies"
"SU"
"WMI"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""SO""" if not @FNAME=="
""SU""" echo @FILE"
"Class Pack"
"Oldies"
"WMI"
==>popd
我刚刚进入 Bat 文件。 我正在尝试删除网络共享驱动器上的旧文件夹,但按名称跳过了其中的 2 个文件夹。 基本上我需要我每天制作的所有文件并始终保留 2 个旧文件。
删除所有超过 3 天的文件的代码:
PushD "\****-****\build" &&(
ForFiles /D -3 /C "CMD /C if @ISDIR==TRUE echo RD @FILE &RD /S @FILE
) & PopD
我在想这样的事情:if NOT @FNAME == %name%。我不完全理解这个过程,我可以在 forFiles 中有两个条件吗?我之前必须有 /c 吗?
PushD "\****-****\build" &&(
ForFiles /D -3 /C "CMD /C if NOT @FNAME == %name% if @ISDIR==TRUE echo RD @FILE &RD /S @FILE
) & PopD
我好像不明白,你介意帮帮我吗? 谢谢!
有点乱,但我可以在本地目录上完成:
@echo off
mkdir Temp\Temp
REM Copy all old file to Temp dir
forfiles -p "%cd%" -m *.* /D -2 /C "cmd /c xcopy @path %cd%\Temp"
REM copy a random file from Temp dir to Temp/Temp dir and then delete it
FOR %%A in (%cd%\Temp\*) do (
COPY "%%A" %cd%\Temp\Temp\
DEL "%%A"
GOTO :Second
)
:Second
Rem copy second random file from Temp dir
FOR %%A in (%cd%\Temp\*) do (
COPY "%%A" %cd%\Temp\Temp\
GOTO :Del
)
:Del
Rem delete all old files from local dir
forfiles -p "%cd%" -m *.* /D -2 /C "cmd /c del @path"
Rem Copy back two random old files to local dir
xcopy %cd%\Temp\Temp\* %cd%
Rem remove Temp dir
rmdir /s /q Temp
是的,在它们的 then 分支中嵌套 if
命令是具有逻辑 AND
的方法。请注意下一个代码片段中的正确引用:
@ECHO ON >NUL
@SETLOCAL enableextensions
set "name=SO"
set "nam2=SU"
pushd "D:\VB_scripts"
@rem all directories
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE echo @FILE"
@rem all directories except "SO"
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""%name%""" echo @FILE"
@rem all directories except "SO" and "SU"
ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""%name%""" if not @FNAME=="""%nam2%""" echo @FILE"
popd
@ENDLOCAL
输出:
==>D:\bat\SO346676.bat
==>set "name=SO"
==>set "nam2=SU"
==>pushd "D:\VB_scripts"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE echo @FILE"
"Class Pack"
"Oldies"
"SO"
"SU"
"WMI"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""SO""" echo @FILE"
"Class Pack"
"Oldies"
"SU"
"WMI"
==>ForFiles /D -2 /C "CMD /C if @ISDIR==TRUE if not @FNAME=="""SO""" if not @FNAME=="
""SU""" echo @FILE"
"Class Pack"
"Oldies"
"WMI"
==>popd