Чтобы удалить все 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.
Вам необходимо установитьPowerShell7, то вы также можете захотеть установитьТерминал WindowsЕсли вы не знаете, как их установить и открыть, в Интернете есть множество руководств, объясняющих этот процесс лучше, чем я, поэтому я не буду повторять их здесь.
Запустить pwsh.exe
с правами администратора:
Win+ R-> тип pwsh.exe
-> Ctrl+ Shift+Enter
Затем в консоли, чтобы получить все элементы внутри «Путь\к\папке»:
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
}