Исключить несколько папок с помощью команды Dir

У меня был поиск по форуму с исключением нескольких файлов при использовании команды DIR. Но не нашел то, что мне действительно нужно. Некоторые даже с PHP или VBS действительно не знают, как они работают.

Что я пытаюсь сделать, так это *DIR*ing все папки профилей, а также исключить определенные папки по умолчанию, это часть показа того, какие и сколько пользователей имеют профили на этом компьютере.

Я объясню немного больше, потому что я не могу полностью понять, каковы мои потребности.

Если я использую DIR без findstr.

DIR /A:d /B "F:\Documents and Settings"

Выход:

Administrator
All Users
Default User
LocalService
userprofile1
NetworkService
userprofile2
...
userprofileN

Но мои настоящие потребности таковы:

userprofile1
userprofile2
...
userprofileN

Я также зашел так далеко со своим сценарием.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
IF ERRORLEVEL 1 ECHO Your OS does not support enable extensions
DIR /A:d /B "F:\Documents and Settings" | findstr /v "Admin" | findstr /v "Default" | findstr /v "LocalService" | findstr /v "NetworkService"
EXIT

Мой приведенный выше скрипт действительно работает, но исправлен и может быть не очень хорошо закодирован. Я хотел бы спросить о том, можно ли использовать цикл For, чтобы сократить длинные каналы findstr и установить переменную, содержащую имена папок, для исключения? Я предпочитаю использовать переменную вместо текстовых файлов, содержащих папки для исключения.

Я придумал ниже, но он дублирует вывод:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
IF ERRORLEVEL 1 ECHO Your OS does not support enable extensions
SET xUser="Admin" "Default" "hi_I_will_be_future_added"
FOR %%A IN (!Xuser!) DO ( 
 DIR /A:d /B "F:\Documents and Settings" | findstr /v %%A
)

Спасибо этому замечательному форуму и за все, что могло помочь мне и другим.


person Double Quotes    schedule 09.06.2014    source источник
comment
Извините за userprofile1-N, это просто фиктивное имя. И если все пользователи названы так, ваш скрипт может действительно работать. В любом случае, спасибо.   -  person Double Quotes    schedule 10.06.2014
comment
Ой! Я очень визуален, когда читаю описания! Например, команда DIR показывает полный путь к профилям пользователей, но вы сказали, что мои фактические потребности таковы: и показывать только профили, так что вы хотите удалить путь или нет? ;-). Смотрите мой ответ ниже...   -  person Aacini    schedule 10.06.2014
comment
Спасибо, буду тестить. Через несколько дней я вернусь и отпишусь о результатах. Идея с использованием условия сравнения выглядит очень аккуратно. Красиво красиво и спасибо спасибо. :)   -  person Double Quotes    schedule 10.06.2014


Ответы (3)


@echo off
setlocal EnableDelayedExpansion

set exclude=/Administrator/All Users/Default User/LocalService/NetworkService/
for /F "delims=" %%a in ('DIR /A:d /B "F:\Documents and Settings"') do (
   if "!exclude:/%%~Na/=!" equ "%exclude%" echo %%a
)

Если вы хотите показать только имя пользователя (без пути «F:\Documents and Settings»), используйте echo %%~Na

person Aacini    schedule 10.06.2014
comment
Мощный !! Я бы никогда не смог сделать такие коды, они слишком сложны. А также кое-что, о чем я мечтал с циклом For.., спасибо, Аачини. - person Double Quotes; 10.06.2014
comment
Вы можете просмотреть подробное объяснение этого метода здесь: stackoverflow.com/questions/24139331/ - person Aacini; 10.06.2014
comment
Спасибо, проверил на Windows XP. Это сработало как шарм, но мне немного любопытно насчет echo %%~Na, потому что оно уже повторяет только имя профиля пользователя (которое я предпочитаю). - person Double Quotes; 13.06.2014

Разбит на несколько строк для лучшего чтения, но, конечно, можно и в одну строку

@echo off
    dir /ad /b "c:\Documents And Settings" ^
    | findstr /l /i /x /v   ^
        /c:"Administrator"  ^
        /c:"All Users"      ^
        /c:"Default User"   ^
        /c:"LocalService"   ^
        /c:"NetworkService" 

Или вместо того, чтобы передавать все строки в качестве аргументов /c:"...", вы можете создать файл со всеми строками для исключения и использовать переключатель /g:filename в findstr.

person MC ND    schedule 09.06.2014

person    schedule
comment
Элли, Аллисия, Аллин, Эллисон, Эллисон? - person MC ND; 10.06.2014
comment
Хм, но на самом деле это то, о чем я думал и без цикла For.... Не знал, что я могу сделать это с помощью одной команды FINDSTR. - person Double Quotes; 10.06.2014