удалить все подпапки с помощью пакетного файла?

удалить все подпапки с помощью пакетного файла?

Чтобы удалить все 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
}

Связанный контент