【问题标题】:Batch file (ForFiles multiple conditional commands for logic)?批处理文件(ForFiles 用于逻辑的多个条件命令)?
【发布时间】:2015-09-29 13:14:15
【问题描述】:

我刚刚进入 Bat 文件。 我正在尝试删除网络共享驱动器上的旧文件夹,但按名称跳过 2 个包含文件夹。 基本上我需要每天制作的所有文件,并始终保留 2 个旧文件。

删除所有超过 3 天的文件的代码:

PushD "\\****-****\build" &&(
ForFiles /D -3 /C "CMD /C if @ISDIR==TRUE  echo RD @FILE &RD /S @FILE
 ) & PopD

我在想这样的事情:如果不是@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

我好像听不懂,你介意帮我吗? 谢谢!

【问题讨论】:

  • 就像我很怀念批处理文件一样,它们从 DOS 时代就已经存在,而且非常有限。考虑切换到 PowerShell。它是一种功能齐全的语言,可以与操作系统的几乎所有部分进行交互,如果你愿意,你甚至可以编译自定义模块。此外,随着批处理文件的相关性越来越低,掌握更多有用的知识。

标签: batch-file command


【解决方案1】:

这有点乱,但我可以在本地目录上完成:

 @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

【讨论】:

  • 非常感谢!但我正在处理无法复制的 20Gb 文件,我只是在寻找多个条件。
【解决方案2】:

是的,在它们的 then 分支中嵌套if 命令是获得逻辑AND 的方法。注意在下一个代码 sn-p 中正确引用:

@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\SO\31346676.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

【讨论】:

  • 非常感谢!它对我有用,但有一个问题。我的原作做错了什么:if NOT @FNAME == %name%
猜你喜欢
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多