无忧启动论坛

标题: 如何取消批处理重复删除子目录文件夹 [打印本页]

作者: wenbieba    时间: 2023-7-10 18:50
标题: 如何取消批处理重复删除子目录文件夹
本帖最后由 wenbieba 于 2023-7-11 17:24 编辑

以Windows Defender文件夹为例
利用批处理删除Windows Defender文件夹,比如此文件下有子文件夹0000,11111等但是在用下方批处理时存在二次删除现象,如第一次显示已成功处理三个文件夹,后又出现找不到Windows Defender\0000路径,或找不到Windows Defender\1111路径,但其实之前已经删除了,这样一来会出现大量找不到路径错误
命令如下:
@echo off
for /f "delims=" %%i in ('dir /b /ad /s "%SystemDrive%\Program Files" "%SystemDrive%\Program Files (x86)" "%SystemDrive%\ProgramData\Microsoft" 2^>nul ^| findstr /ilc:"Windows Defender"') do (
    echo %%i
    takeown /f "%%i" && icacls "%%i" /grant administrators:F /t
    RD /Q /S "%%i"
)
曾修改dir / 参数,findstr / 参数,均无果


附上相关提示
已处理的文件: C:\Program Files\Windows Defender
已处理的文件: C:\Program Files\Windows Defender\11111111
已成功处理 2 个文件; 处理 0 个文件时失败

I:\☆★MSMGToolkit★☆\Toolkit>(
if exist C:\Program Files\Windows Defender\11111111 takeown /f "C:\Program Files\Windows Defender\11111111"   && icacls "C:\Program Files\Windows Defender\11111111" /grant administrators:F /t
RMDIR /S /Q "C:\Program Files\Windows Defender\11111111"
)
系统找不到指定的路径。




请教大师如何修改



经测试,12#完美解决,
findstr /ilc:"Windows Defender
改为
findstr /i /r /c:"Windows Defender[^\\]*$"








作者: china.gaofeng    时间: 2023-7-10 19:41
在do循环里加个 if exist %%i 判断呗
作者: wenbieba    时间: 2023-7-10 19:57
china.gaofeng 发表于 2023-7-10 19:41
在do循环里加个 if exist %%i 判断呗

还是不行,存在二次删除,找不到路径
作者: china.gaofeng    时间: 2023-7-10 20:07
如果你只是要删除Windows Defender文件夹,那就在findstr里用正则表达式限定恰恰到Windows Defender目录

findstr /i /r /c:"Windows Defender$"
作者: szwp    时间: 2023-7-10 20:07
先不要删,输出列表
作者: wenbieba    时间: 2023-7-10 20:23
china.gaofeng 发表于 2023-7-10 20:07
如果你只是要删除Windows Defender文件夹,那就在findstr里用正则表达式限定恰恰到Windows Defender目录

...

还是有问题,在Program Files目录里新建的Windows Defender222文件夹没删除掉
作者: wenbieba    时间: 2023-7-10 20:25
china.gaofeng 发表于 2023-7-10 20:07
如果你只是要删除Windows Defender文件夹,那就在findstr里用正则表达式限定恰恰到Windows Defender目录

...

目的就是删除含有指定字符的文件夹
作者: wenbieba    时间: 2023-7-10 20:31
szwp 发表于 2023-7-10 20:07
先不要删,输出列表

怎么改
作者: szwp    时间: 2023-7-10 20:49
wenbieba 发表于 2023-7-10 20:31
怎么改

删除父后就不需删除子了,要判断
作者: china.gaofeng    时间: 2023-7-10 20:53
wenbieba 发表于 2023-7-10 20:23
还是有问题,在Program Files目录里新建的Windows Defender222文件夹没删除掉

那你试试把正则表达式改成"Windows Defender[^\\]*$"
作者: wenbieba    时间: 2023-7-10 21:28
wenbieba 发表于 2023-7-10 20:31
怎么改

麻烦写一下
作者: china.gaofeng    时间: 2023-7-10 21:53
wenbieba 发表于 2023-7-10 20:23
还是有问题,在Program Files目录里新建的Windows Defender222文件夹没删除掉

findstr /i /r /c:"Windows Defender[^\\]*$"
作者: wenbieba    时间: 2023-7-10 22:28
china.gaofeng 发表于 2023-7-10 21:53
findstr /i /r /c:"Windows Defender[^\\]*$"

已成功,谢谢
作者: holley2008    时间: 2023-7-11 08:57
wenbieba 发表于 2023-7-10 22:28
已成功,谢谢

记得修改标题:已解决
作者: wenbieba    时间: 2023-7-11 09:11
holley2008 发表于 2023-7-11 08:57
记得修改标题:已解决

好的
作者: conlin888    时间: 2023-7-11 09:52
用find也可以,

@echo off
for /f "delims=" %%i in ('dir /b /ad /s "%SystemDrive%\Program Files\" "%SystemDrive%\Program Files (x86)\" "%SystemDrive%\ProgramData\Microsoft\" 2^>nul^|find /i "Windows Defender"') do (
    echo %%~ni|find /i "Windows Defender">nul&&(
      echo %%i
      takeown /f "%%i" && icacls "%%i" /grant administrators:F /t
      RD /Q /S "%%i"
    )
)
作者: conlin888    时间: 2023-7-11 10:44
本帖最后由 conlin888 于 2023-7-11 10:49 编辑

不用find,效率更高

for /f "delims=" %%i in ('echo "%SystemDrive%\Program Files"^&echo "%SystemDrive%\Program Files (x86)"^&echo "%SystemDrive%\ProgramData\Microsoft"') do (
    if exist "%%~i\Windows Defender\" (
       echo %%~i\Windows Defender
       takeown /f "%%~i\Windows Defender" && icacls "%%~i\Windows Defender" /grant administrators:F /t
       RD /Q /S "%%~i\Windows Defender"
    )
)
作者: wenbieba    时间: 2023-7-11 11:49
conlin888 发表于 2023-7-11 10:44
不用find,效率更高

for /f "delims=" %%i in ('echo "%SystemDrive%\Program Files"^&echo "%SystemDriv ...

谢谢大佬
作者: wenbieba    时间: 2023-7-11 11:54
conlin888 发表于 2023-7-11 10:44
不用find,效率更高

for /f "delims=" %%i in ('echo "%SystemDrive%\Program Files"^&echo "%SystemDriv ...

不行的,刚新建一个Windows Defender025487文件夹,并没删除
作者: wenbieba    时间: 2023-7-11 11:56
conlin888 发表于 2023-7-11 09:52
用find也可以,

@echo off

这个还是存在二次删除现象,

已处理的文件: C:\Program Files\Windows Defender11111
已处理的文件: C:\Program Files\Windows Defender11111\2222
已成功处理 2 个文件; 处理 0 个文件时失败

I:\☆★MSMGToolkit★☆\Toolkit>(echo 2222  | find /i "Windows Defender" 1>nul  && (
echo C:\Program Files\Windows Defender11111\2222
takeown /f "C:\Program Files\Windows Defender11111\2222"   && icacls "C:\Program Files\Windows Defender11111\2222" /grant administrators:F /t
RD /Q /S "C:\Program Files\Windows Defender11111\2222"
) )
作者: conlin888    时间: 2023-7-11 11:57
wenbieba 发表于 2023-7-11 11:54
不行的,刚新建一个Windows Defender025487文件夹,并没删除

文件夹不固定, 只能用find了:

@echo off
for /f "delims=" %%i in ('dir /b /ad /s "%SystemDrive%\Program Files\" "%SystemDrive%\Program Files (x86)\" "%SystemDrive%\ProgramData\Microsoft\" 2^>nul^|find /i "Windows Defender"') do (
    echo %%~ni|find /i "Windows Defender">nul&&(
      echo %%i
      takeown /f "%%i" && icacls "%%i" /grant administrators:F /t
      RD /Q /S "%%i"
    )
)
作者: wenbieba    时间: 2023-7-11 11:58
conlin888 发表于 2023-7-11 10:44
不用find,效率更高

for /f "delims=" %%i in ('echo "%SystemDrive%\Program Files"^&echo "%SystemDriv ...

12#
完美解决
作者: conlin888    时间: 2023-7-11 14:14
wenbieba 发表于 2023-7-11 11:58
12#
完美解决

解决了就好, 其实用exist判断也可以了,
@echo off
for /f "delims=" %%i in ('dir /b /ad /s "%SystemDrive%\Program Files\" "%SystemDrive%\Program Files (x86)\" "%SystemDrive%\ProgramData\Microsoft\" 2^>nul^|find /i "Windows Defender"') do (
    if exist "%%i\" (
      echo %%i
      takeown /f "%%i" && icacls "%%i" /grant administrators:F /t
      RD /Q /S "%%i"
    )
)

作者: szwp    时间: 2023-7-11 16:09
先删父再删子就会找不到,反过来就不会。
作者: microlaf    时间: 2023-7-11 16:39
wenbieba 发表于 2023-7-11 09:11
好的

修改完标题,应该编辑帖子,上面是原来的问题,下面附上解决方案一、方案二。
至少也要提示几楼是正确解答。这样子有利于后来查询者快速获得帮助。
作者: wenbieba    时间: 2023-7-11 17:00
microlaf 发表于 2023-7-11 16:39
修改完标题,应该编辑帖子,上面是原来的问题,下面附上解决方案一、方案二。
至少也要提示几楼是正确解 ...

好的
作者: a2223843880    时间: 2023-7-11 17:30
感谢分享
作者: wenbieba    时间: 2023-7-12 10:27
china.gaofeng 发表于 2023-7-10 20:07
如果你只是要删除Windows Defender文件夹,那就在findstr里用正则表达式限定恰恰到Windows Defender目录

...

大佬能帮看看这个吗,
利用命令关闭一些Windows功能,如:TFTP、Microsoft-Hyper-V用此以TFTP为例
Dism /online /Get-FeatureInfo /FeatureName:TFTP  均运行正常,可关闭,
为了方便,把需要禁用的功能名写入一个TXT记事本本內
用以下命令执行:

for /F %%i in (' Type "%~dp0Windows\Remove.TXT" 2^>nul')
for /F "tokens=2 delims=: " %%a in ('dism /online /get-features ^| Findstr /I /C:"FeatureName : %%i"') do if "%%a" NEQ "" Call Dism /online /Disable-Feature /FeatureName:%%a >nul
   )
运行之后无效果。麻烦大佬指点
作者: wenbieba    时间: 2023-7-12 10:30
conlin888 发表于 2023-7-11 14:14
解决了就好, 其实用exist判断也可以了,
@echo off
for /f "delims=" %%i in ('dir /b /ad /s "%SystemD ...

大佬能帮看看这个吗,
利用命令关闭一些Windows功能,如:TFTP、Microsoft-Hyper-V用此以TFTP为例
Dism /online /Get-FeatureInfo /FeatureName:TFTP  均运行正常,可关闭,
为了方便,把需要禁用的功能名写入一个TXT记事本本內
用以下命令执行:

for /F %%i in (' Type "%~dp0Windows\Remove.TXT" 2^>nul')
for /F "tokens=2 delims=: " %%a in ('dism /online /get-features ^| Findstr /I /C:"FeatureName : %%i"') do if "%%a" NEQ "" Call Dism /online /Disable-Feature /FeatureName:%%a >nul
   )
运行之后无效果。麻烦大佬指点
作者: conlin888    时间: 2023-7-12 11:19
wenbieba 发表于 2023-7-12 10:30
大佬能帮看看这个吗,
利用命令关闭一些Windows功能,如:TFTP、Microsoft-Hyper-V用此以TFTP为例
Dism ...

试试,

for /F %%i in ('Type "%~dp0Windows\Remove.TXT" 2^>nul') do (
   set a=%%i
   for /F "tokens=2 delims=: " %%a in ('call dism /online /get-features ^| Findstr /I /C:"FeatureName : %%a%%"') do if "%%a" NEQ "" Dism /online /Disable-Feature /FeatureName:%%a >nul
)
作者: china.gaofeng    时间: 2023-7-12 11:24
wenbieba 发表于 2023-7-12 10:27
大佬能帮看看这个吗,
利用命令关闭一些Windows功能,如:TFTP、Microsoft-Hyper-V用此以TFTP为例
Dism ...

第一层FOR的括号缺失了吧?

另外,像这种目的,真不如直接用powershell来的方便
作者: szwp    时间: 2023-7-12 11:42
第一个for忘了do
作者: wenbieba    时间: 2023-7-12 11:48
china.gaofeng 发表于 2023-7-12 11:24
第一层FOR的括号缺失了吧?

另外,像这种目的,真不如直接用powershell来的方便

能帮具体写一下吗
作者: china.gaofeng    时间: 2023-7-12 12:01
本帖最后由 china.gaofeng 于 2023-7-12 12:30 编辑
wenbieba 发表于 2023-7-12 11:48
能帮具体写一下吗

Get-Content 'remove.txt' |% {Get-WindowsOptionalFeature $_ -online|Disable-WindowsOptionalFeature -online}

大概是这样的
作者: wenbieba    时间: 2023-7-12 18:01
conlin888 发表于 2023-7-12 11:19
试试,

for /F %%i in ('Type "%~dp0Windows\Remove.TXT" 2^>nul') do (

不行,一闪而过
作者: conlin888    时间: 2023-7-12 20:31
本帖最后由 conlin888 于 2023-7-12 20:42 编辑
wenbieba 发表于 2023-7-12 18:01
不行,一闪而过

你自己检查一下啊,CMD中的空格bug,

for /F %%i in ('Type "%~dp0Windows\Remove.TXT" 2^>nul') do (
   set a=%%i
   for /F "tokens=2 delims=: " %%a in ('call dism /online /get-features ^| Find /i "FeatureName : %%a%%"') do if "%%a" NEQ "" Dism /online /Disable-Feature /FeatureName:%%a >nul
)
作者: wenbieba    时间: 2023-7-12 21:19
conlin888 发表于 2023-7-12 20:31
你自己检查一下啊,CMD中的空格bug,

for /F %%i in ('Type "%~dp0Windows\Remove.TXT" 2^>nul') do (
...

检查了,不行
作者: conlin888    时间: 2023-7-13 08:15
本帖最后由 conlin888 于 2023-7-13 08:27 编辑
wenbieba 发表于 2023-7-12 21:19
检查了,不行

你自己原来的代码有问题(红字演示专用, 你自己修改),

@echo off
for /F %%I in ('echo tftp') do (
   for /F "tokens=2 delims=: " %%a in ('dism /online /get-features^|Find /i ": %%I"') do if /i "%%a"=="%%I" @echo Dism /online /Disable-Feature /FeatureName:%%a
)

pause


作者: szwp    时间: 2023-7-13 16:29
for %%i in (a b c) do echo %%i
先让列表显示正确后,再往下玩。




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3