我的 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
更多资源
- 称呼
- 为了
-
- 批量替换 (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
- 德尔
-
/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