В системе * NIX вы можете легко набрать rmdir * чтобы удалить все пустые каталоги . , rmdir будет жаловаться на непустые каталоги и не удалит их.

В основном, если у вас есть такое дерево:

/
  d0/
    file
  d1/
    d0/
  d2/
  d3/

Тогда запуск rmdir * изнутри / приведет к удалению только d2/ и d3/ . d0/ и d1/ будут оставлены в покое с повторяющейся ошибкой о том, что они не пустые, чтобы предотвратить потерю содержимого в подвешенном состоянии.

/
  d0/
    file
  d1/
    d0/

Я не смог найти Windows, эквивалентную этому. Ближайшая вещь - это rmdir /s . , что эквивалентно rm -r . кроме того, что отказывается удалять . потому что оболочка использует его. Не уверен, если rm -r . также отказывается удалять . , Не проверял это.

Как и * NIX rmdir , Windows rmdir откажется удалить один каталог, если он не пуст. Тем не менее, похоже, что нет селектора с подстановочными знаками, подобного типичному * , что странно, потому что этот токен можно использовать где-либо еще.

Именно такие вещи меня расстраивают из-за командной строки Windows. Если у меня есть 4000 каталогов, то явное rmdir каждого отдельного каталога явно не является нормальным вариантом. Должен быть лучший способ.

Я попытался создать оператор for соответствии с синтаксисом в справке по использованию (for /?)

FOR %variable IN (set) DO command [command-parameters]

...получить...

for %f in * do rmdir %f

и несколько вариантов этого (например, изменение второго %f на %f% , использование заглавных букв в синтаксисе, хотя я знаю, что он не учитывает регистр, окружая * паренами и т. д.). Ни один из которых не работал. Все терпит неудачу с необъяснимыми и бесполезными ошибками как:

%f was unexpected at this time.
* was unexpected at this time.

(Примечание: я пытаюсь сделать это в интерактивном режиме, а не в сценарии)

Или в случае (*) варианта ...

>for %f in (*) do rmdir %f
>rmdir file
The directory name is invalid.
>dir
 Volume in blah blah blah

 Directory of blah

 blah blah    <DIR>          .
 blah blah    <DIR>          ..
 blah blah    <DIR>          nonemptydir
 blah blah    <DIR>          emptydir
 blah blah                 1 file
     1 File(s)             1 bytes
     4 Dir(s)    huge number bytes free

... это даже не касается каталогов.

Я не понимаю, почему он это сделал. Я следовал синтаксису, как это было описано в справке.

Powershell не вариант. Я должен быть в состоянии сделать это в оболочке, которая гарантированно будет установлена, т.е. cmd.exe . Джефф Цейтлин сообщил мне, что Powershell гарантированно> = Windows 7 . Тем не менее, cmd.exe по-прежнему является предпочтительным.

2 ответа2

2

%f был неожиданным в это время. * было неожиданным в это время.

for %f in * do rmdir %f

При использовании внутри пакетного файла вам нужно удвоить % s.

Набор, на который вы ссылаетесь, является выражением в скобках. Скобки не являются обязательными.

Исправленная командная строка:

for %f in (*) do rmdir %f

Правильный пакетный файл:

for %%f in (*) do rmdir %%f

Это задокументировано в онлайн-справке:

> for /?
Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

И в течение:

Если вы используете команду FOR в командной строке, а не в пакетной программе, используйте только один знак процента: %G вместо %%G

Параметры FOR

Первый параметр должен быть определен с использованием одного символа, например буквы G.

FOR %%G IN ...

2

Ваше утверждение FOR требует переключения /D : FOR /D %I in (*) do ... Это приводит к тому, что файлы полностью пропускаются, и обрабатываются только папки (каталоги). Так как RMDIR/RD не удалит непустую директорию, это то, что вам нужно; обратите внимание, что разные версии Windows могут по-разному реагировать на ошибку при попытке удаления непустого каталога.

Ссылки: SS64 на FOR и FOR /D (FOR для папок)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .