2017-02-17 4 views
0

В попытке найти способ проверки файлов в каталогах, я нашел это:Проверка файлов только в определенных подкаталогов

>nul 2>nul dir /a-d /s "folderName\*" && (echo Files exist) || (echo No files found) 

Он работает достаточно хорошо, за исключением того, что мне действительно нужно, чтобы быть в состоянии проверить только в половина подкаталогов, которые следуют конкретному соглашению об именах.

enter image description here

Есть в любом случае, чтобы переработать эту линию, чтобы проверить только в папках «ToBeMoved»?

Я пытался писать так:

>nul 2>nul dir /a-d/b/s "\\SERVER\Path\*ToBeMoved" && (echo Files exist) || (echo No files found) 

Но это не работает. Я предполагаю, потому что он ищет папки на уровне пользователя со строкой «ToBeMoved».

+0

Вы можете использовать 'команду FOR/D/r', чтобы получить список ToBeMoved каталогов, а затем проверить, каталог пуст или нет. – Squashman

+0

Ваш первый код не может работать так, как вы описываете, если не добавить параметр '/ b'. – dbenham

ответ

1

Я считаю, что в первом коде, указанном вами, отсутствует опция /b. Предполагая, что это на самом деле есть, тогда ваш исходный код перечисляет полный путь каждого файла в иерархии каталогов, но вы направляете вывод в null и условно выполняете действие в зависимости от того, были ли найдены файлы или нет.

Вместо перенаправления на нуль вы можете просто подключиться к FIND, логически ищет путь, который содержит *ToBeMoved\. Этот вывод может быть перенаправлен на нуль, и вы можете условно принять действие на основе кода возврата FIND. Я бы проигнорировал случай при поиске строки.

dir /b /a-d /s "folderName" 2>nul|find /i "ToBeMoved\" >nul && (echo Files exist) || (echo No files found) 

Вы можете использовать FINDSTR вместо этого, но тогда слеш должен быть экранированы

dir /b /a-d /s "folderName" 2>nul|findstr /i "ToBeMoved\\" >nul && (echo Files exist) || (echo No files found) 
+0

После некоторого тестирования на этом, потому что он, казалось, не работал, я обнаружил, что в нескольких подкаталогах существует файл под названием «Thumb.db». Кажется, это скрытый файл, есть ли способ игнорировать скрытые файлы? – Neal

+0

Nevermind, '/ a-h' – Neal

1

Дайте это попробовать. Измените корневой путь, где вам нужно быть с командой PUSHD.

@echo off 

PUSHD "H:\users" 
FOR /F "delims=" %%G IN ('dir /ad /b /s ToBeMoved') DO (
    pushd "%%~G" 
    >nul 2>nul dir /a-d/b/s && (echo Files exist in %%~G) || (echo No files found in %%~G) 
    popd 
) 
popd 
pause 

Выход для меня.

No files found in H:\users\johndoe\ToBeMoved 
No files found in H:\users\maryjane\ToBeMoved 
Files exist in H:\users\UserWithFiles\ToBeMoved 
Press any key to continue . . . 

EDIT: Просто, чтобы показать вам, что у меня есть файл в папку с именем ToBeMoved Я побежал реж CMD из командной строки. Я тестирую только один файл для тестирования.

H:\users>dir /a-d/b/s 
H:\users\UserWithFiles\ToBeMoved\moveme.txt 
+0

Я смущен, я никогда раньше не использовал функцию pushd. Где вы указываете скрипт на конкретное дерево каталогов? Я заменил это «H: \ users» на «\\ SERVER \ Path \ Users \», и ​​он не дал мне то же самое на выходе. Я получил «Файлы не найдены». Нажмите любую клавишу, чтобы продолжить. ' – Neal

+0

@Neal Correct. Вы вставляете свой корневой путь с помощью команды PUSHD. Это может быть UNC-путь или буква диска с дорожкой. Похоже, вы не тестировали мой точный код, потому что вы должны были видеть его эхо-код ** Нет файлов, найденных в (путь к папке) **. – Squashman

+0

Я скопировал и вставил его прямо из ответа и заменил путь. Я проверил его несколько раз, но всегда получаю тот же результат. – Neal