2016-11-21 3 views
2

Я пишу пакетный файл, я застрял в середине поиска цикла:Найти полный путь конкретного файла с циклом

FOR /R %MapDirectory% %%s IN ("%FullName%") DO SET DesiredMapFilePath=%%s 

То, что я хочу сделать, это найти полный путь к файлу заданный его файлом из данного корневого каталога во всех его подкаталогах. Гарантируется, что имеется только один файл с заданным именем.

%MapDirectory% является корневым путем (е. Г .: %~dp0\some\directory\wanna\start\from) и %FullName% является полным именем файла, который я ищу (е. Г .: foo.txt).

В приведенной выше командной строке не удается найти данный файл, который фактически существует в поддиректории данного корневого пути (%MapDirectory%).

+0

'for' ('/r') не имеет доступа к файловой системе, если нет маски, поэтому самый простой способ заключается в использовании 'DIR/b' ('/ S') и проанализировать его вывод' for/F' ... – aschipfl

+0

Спасибо aschipfi! Не знал, что/r работает только под шаблоном. – user58569

ответ

1

Совместимый с командой дир

FOR /F "tokens=*" %%s IN ('dir /b /s "%MapDirectory%\%FullName%"') DO (set DesiredMapFilePath=%%s) 
+0

Спасибо за пример. Я буду тестировать ваш образец tmr. (Живя в разном часовом поясе), но на данный момент одно любопытство,% MapDirectory% \% FullName% вызывает у меня удивление, похоже, что поиск файлов из текущего каталога, а не его подкаталога ... – user58569

+0

/s в команде dir также ищет подпапки – Richard

+0

Это работает для меня! Спасибо за ваш комментарий! – user58569

1

На основании предоставленной информации вы можете использовать команду Where.

For /F "Delims=" %%s In (
    'Where/R "%~dp0some\directory\wanna\start\from" "foo.txt"' 
) Do Set "DesiredMapFilePath=%%s" 

[EDIT /]

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

For /F "Delims=" %%s In ('Where/R "%MapDirectory%" "foo.txt"' 
    ) Do Set "DesiredMapFilePath=%%s" 
+0

Спасибо за ваш пример. Будет проверять его tmr. Я пытался использовать ключевое слово в prev, но ничто не работает для меня в то время. Это тоже работает для win8? – user58569

+0

Не должно быть причин, по которым Windows 8 не должна правильно запускать этот код. – Compo

+0

Я проверил с вашим примером кода, но не работал для меня, он по-прежнему не смог найти, что foo.txt запускается из \ из в его подкаталог по какой-то причине. Во всяком случае, над образцом работает для меня и спасибо за ваш комментарий! – user58569