要从当前路径中删除所有bin
以任何子文件夹为根的文件夹,我有以下脚本,这是我尝试过的(就我对批处理脚本的了解而言):
setlocal enabledelayedexpansion
for /f %%i in ('dir /a:d /s /b *')
do
(
set d=!i!\bin
if exist !d! rd !d!
)
endlocal
它不起作用,甚至看起来还有一些语法错误。但找出它是什么很麻烦。当我从 运行批处理文件时cmd
,它显示以下内容:
/s was unexpected at this time.
请注意,为了运行该批处理文件cmd
,我必须将其更改为%%
,%
否则它会抱怨
The syntax of the command is incorrect.
所以,如果我们想从 运行批处理文件cmd
,我们需要先用 替换所有,%%
这太荒谬了%
?真的吗:D 如果直接运行批处理文件(通过双击它),控制台窗口会立即关闭,而我没有任何机会查看哪里出了问题。我甚至尝试PAUSE
在末尾放一个,以便它可以暂停,但它也不起作用(我知道在此之前有一些错误导致暂停也不起作用)。
回到我最初的问题,因为我不知道这里出了什么问题(根据报告的消息cmd
),我真的被困住了。希望你们能在我的脚本中找出错误并帮助我修复它。
答案1
@echo off
cd/d "%~dp0"
for /f delims^= %%i in (
'dir /a:d/s/b ^| findstr /eil "\bin \obj"'
)do echo; rd "%%~i"
观察:1它的语法倾向于服务于其他语言,但不服务于 bat/cmd 脚本,这个循环不能以那种方式工作......
for /f %%i in ('loop command') do ( // dynamic variable %%i can be expanded, that // doesn't mean it will be treated/expanded // like a regular variable %i% at runtime !i! )
该命令的语法不正确。
- 观察:2该代码会在屏幕上列出结果,
echo;
如果输出看起来正确,则运行/删除文件夹
其他资源:
答案2
使用 PowerShell,因为它比 cmd 功能强大得多。
您需要安装PowerShell 7,那么你可能还想安装Windows 终端,如果您不知道如何安装和打开它们,网上有大量的教程可以比我更好地解释这个过程,所以我就不再重复了。
pwsh.exe
以管理员权限运行:
Win+ R-> 类型pwsh.exe
- Ctrl> Shift++Enter
然后,在控制台中获取“Path\to\folder”内的所有项目:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse
仅列出子目录:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse -Directory
根据模式过滤第一个命令的输出:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' }
删除链中前一个链接过滤的所有项目:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' } | Remove-Item -Recurse -Force -Confirm:$false
上面的代码实现了你想要的功能,path\to\folder 是一个占位符,将其更改为实际(绝对)路径,例如,如果路径是“D:\MyFolder”,则将其更改为“D:\MyFolder”,'bin|obj' 是一个正则表达式,如果你需要其他模式,请将其替换为你需要的模式,要构造模式,只需使用垂直管道连接选项即可。将路径和模式括在引号中。
警告:上述操作会自动删除所有正确指定的内容而无需确认提示,如果您没有准备好,请不要运行它。
现在让我们来简化一下整个事情:
gci "Path\to\folder" -Fo -R | % {$_.Name -match 'bin|obj' } | ri -R -Fo -Con:$false
将代码包含在函数中以提高可重用性:
function remove-filtered ($path, $pattern) {
Get-ChildItem -Path $path -Force -Recurse | Where-Object {$_.Name -match $pattern } | Remove-Item -Recurse -Force -Confirm:$false
}