单个批处理脚本用于清除多个文件夹(先前指定的一个或两个文件除外)

单个批处理脚本用于清除多个文件夹(先前指定的一个或两个文件除外)

我的 Windows 7 64 位系统中有一个正在运行的 Magento 2.x 网站的文件夹结构,位于C:\UwAmp\www\magento2root路径。

现在这个 Magento 根文件夹包含以下目录-子目录对作为直接子目录(例如 [magento2root]/var/cache):

var/tmp
var/cache
var/page_cache
var/generation
var/view_preprocessed
var/composer_home
var/log
var/report
var/session
pub/static

现在,上述某些路径包含.htaccess(例如 pub/static/.htaccess)文件,我想保留这些文件,并且我需要.htaccess通过单个脚本删除所有提到路径的相关文件之外的所有内容(文件、子文件夹、子子文件夹等)。

下面是我尝试放入脚本(for pub/static)的命令,但它们也会删除 .htaccess:

del /q "%cd%/pub/static/.htaccess/*"
FOR /D %%p IN ("%cd%/pub/static/.htaccess"/*.*) DO rmdir "%%p" /s /q

由于我不是 Windows 批处理脚本的专家,因此我正在手动完成这个过程,有人可以帮我编写脚本吗?

答案1

我想要保留,并且我需要通过单个脚本删除所有提到路径的相关 .htaccess 文件之外的所有内容(文件、子文件夹、子子文件夹等)。

您可以使用FOR /F循环和DIR带有/A-D开关的命令来排除文件夹并以递归方式遍历目录*.*。您可以使用条件IF逻辑来表示,如果命令迭代的文件等于DIR名称.htaccess,则不要删除该文件。否则,它将继续处理DEL具有其他名称的文件。

现在文件清理已完成,您可以Robocopy使用源路径和目标路径相同此时,除了包含文件之外,其余内容应已存在.htaccess


批处理脚本

重要的: 请务必从测试位置进行测试,以确保在针对生产系统运行之前它能够满足要求。

笔记: 顶部FOR循环 ( %%A) 将是主目录父级文件夹下的子文件夹名称\路径列表,您只希望对其应用清理。您可以使用该CALL命令并将迭代值作为第一个参数传递给下面的例程,然后该例程将设置要递归运行清理的文件夹位置的最终完整路径。

@ECHO ON

FOR %%A IN (test,site1,site2\folder,pub\static) DO (CALL :routine "%%~A")
GOTO :EOF

:routine
SET SrcDir=C:\UwAmp\www\magento2root\%~1
FOR /F "TOKENS=*" %%p IN ('DIR /S /B /A-D "%SrcDir%\*.*"') DO IF NOT [%%~nxp]==[.htaccess] DEL /Q /F "%%~p"
ROBOCOPY "%SrcDir%" "%SrcDir%" /S /MOVE
IF NOT EXIST "%SrcDir%" MD "%SrcDir%"
GOTO :EOF

更多资源

  • 称呼
  • 为了
  • 为/F

    • 批量替换 (FOR /?)

    此外,FOR 变量引用的替换功能也得到了增强。现在您可以使用以下可选语法:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    
  • 目录

    /A Displays files with specified attributes. attributes D Directories R Read-only files H Hidden files A Files ready for archiving S System files I Not content indexed files L Reparse Points - Prefix meaning not

  • 如果

  • 德尔
  • Robocopy

    /S :: copy Subdirectories, but not empty ones.

    /MOVE :: MOVE files AND dirs (delete from source after copying).

  • 医学博士


批处理中的奖励数组对象作为变量

您可以将数组变量设置为各种格式,然后将其用作循环(set)的部分值FOR(见下面的示例)。您应该测试所选格式,并确认每个迭代值都正确返回,ECHO就像我的示例一样,然后再用于其他命令。我在下面注释掉了一些变体,但我确信还有其他方法,但这只是这种方法的附加材料。

此外,我有一个答案在批处理文件中复制数组对于另一种潜在的方法,您可以使用它来模拟带有索引的数组并相应地迭代后续值,并使用在处理相关命令之前设置的子程序变量的标准。

@ECHO ON

::SET array=1,2,3,4,"5","6","7/7","8"
::SET array=1,2,3,4,5,6,7/7,8
::SET array=1 2 3 4 5 6 7/7 8
SET array=1 2 3 4 5 6 "7 / 7" 8
FOR %%A IN (%array%) DO ECHO %%~A
PAUSE

相关内容