найдите конкретную папку на любом подключенном диске и сообщите ее полный путь UNC

#batch-file #find #directory #unc

#пакетный файл #Найти #каталог #unc

Вопрос:

Мне было интересно, возможно ли с помощью пакетного файла найти определенную папку на любом подключенном диске ПК и сообщить о папках полный путь UNC. Допустим, на ПК есть диски, сопоставленные с N: amp; S: (или любой обычной буквой сетевого диска, если на то пошло). Папка может находиться в любой папке, и я запускаю некоторый код, чтобы найти, где находится папка, она будет в корне общего ресурса диска (избегая необходимости рекурсивного сканирования вложенных папок), например N:Special_Folder однако конечный результат кода будет сообщать О ПОЛНОМ UNC, например

Папка найдена !..

server-vm01 data shared_area special_folder

Надеюсь, это имеет смысл. Я попытался использовать некоторый код, который я уже использую для идентификации USB-накопителя, но мне трудно перенести его на вышеуказанные потребности. Любые указатели были бы полезны, спасибо.

 for %%a in (d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z:) do | find "special_folder" >nul amp;amp; set unc=%%a:
echo %unc%
pause
  

редактировать для устранения неполадок, выводить сетевое использование

Microsoft Windows [версия 10.0.14393] (c) 2016 Корпорация Майкрософт. Все права защищены.

C:UsersAdmin >использование сети Новые подключения будут запомнены.

 Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK           Y:        \DISKSTATIONNetBackup   Microsoft Windows Network
OK           Z:        \DISKSTATIONNetBackup   Microsoft Windows Network
The command completed successfully.


C:UsersAdmin>
  

Я попытался исправить, и я дошел до попытки /F «tokens=2-3 delims= » в первой строке, и это удаляет Microsoft Windows Networ, но затем удаляет букву из пути, например DISKSTATION NetBacku specialfolder

также, если я запускаюсь от имени администратора, как это необходимо, код не отображает какой-либо путь, не так ли? Спасибо

РЕДАКТИРОВАНИЕ (окончательное)

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

Тестовая среда:-

Win10 (UAC включен)

Win7 (UAC выключен)

Два подключенных диска в каждом с тестовой папкой с именем Daphne в корне только одного из 2 дисков.

     @echo off
    FOR /F "skip=2 delims=" %%G IN ('"wmic logicaldisk where drivetype=4 get name,providername /format:csv"') do (
       FOR /F "tokens=2,3 delims=," %%H IN ("%%G") DO (
           IF EXIST "%%IDaphne" echo %%IDaphne
        )
     )
pause
  

Вышеуказанное отлично работает в тестовой системе Win7 (UAC выключен), с администратором или нет. Работает как не администратор Win10 (UAC ВКЛЮЧЕН), хотя не работает как «Администратор».

Ниже работает везде, независимо от администратора или нет, в обеих средах.

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

 @ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

set "_FolderToSearch=Daphne"                  
for /F "delims=" %%D in ('reg query "HKCUNetwork"') do (
  for /F "tokens=1,2,*" %%f in ('reg query "%%~D" /v RemotePath ^| find /I "RemotePath"') do (
    if exist "%%~h%_FolderToSearch%" echo %%~h%_FolderToSearch%
  )
)
pause
  

Ниже на экране выводятся оба фрагмента кода в их рабочих формах:-

 \DISKSTATIONNetBackupDaphne
Press any key to continue . . .

\DISKSTATIONNetBackupDaphne
Press any key to continue . . .
  

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

Спасибо!

Комментарии:

1. Если вы ищете подключенные диски, используйте команду NET USE .

2. Я знаком с этим, но не уверен, как включить в процедуру поиска папки? Спасибо

3. Таким образом, они изменили вывод для Windows 10.

4. Теперь вы можете видеть, как ситуация может выйти из-под контроля, если вы не предоставите достаточно подробностей о своей проблеме.

5. Проблемы стали очевидными только при попытке выполнить код. Если бы я знал, что UAC заблокировал команды сетевого использования, я бы с радостью заявил что-то вроде этого с самого начала. Еще раз спасибо.

Ответ №1:

Подключенные диски недоступны из приглашения с повышенными правами, когда UAC настроен на «Запрос учетных данных» в Windows.

Следующий фрагмент кода должен работать даже из командной строки с повышенными правами:

 @ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

set "_FolderToSearch=models"                  folder name to be searched for

echo no recursion: folder in the root of the drive share:

for /F "delims=" %%D in ('reg query "HKCUNetwork"') do (
  for /F "tokens=1,2,*" %%f in ('reg query "%%~D" /v RemotePath ^| find /I "RemotePath"') do (
    if exist "%%~h%_FolderToSearch%" echo # FOUND [%%~nD:] "%%~h%_FolderToSearch%"
  )
)

echo recursive search:

for /F "delims=" %%D in ('reg query "HKCUNetwork"') do (
  for /F "tokens=1,2,*" %%f in ('reg query "%%~D" /v RemotePath ^| find /I "RemotePath"') do (
    for /F "delims=" %%# in ('dir /B /S /AD "%%~h%_FolderToSearch%*" 2^>NUL') do (
        if /I "%%~nx#"=="%_FolderToSearch%" echo # found [%%~nD:] "%%~#"
    )
  )
)
  

Комментарии:

1.@Squashman хорошее решение (не выполняет поиск во вложенных папках), но 1. запрос ключевого свойства DeviceID вместо name и 2. добавьте некоторую поддержку, например SystemName , чтобы избежать проблемы возврата каретки. Попробуйте … get DeviceID, providername, SystemName /format:csv .

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

Ответ №2:

Я слишком много думал о коде. Использование WMIC и простого IF EXIST должно работать.

  FOR /F "skip=2 delims=" %%G IN ('"wmic logicaldisk where drivetype=4 get name,providername /format:csv"') do (
    FOR /F "tokens=2,3 delims=," %%H IN ("%%G") DO (
        IF EXIST "%%ISpecialFolder" echo %%ISpecialFolder
    )
 )
 pause
  

Комментарии:

1. Святые Угодники, вы в значительной степени справились с этим!! По возможности требуется небольшая настройка. Сначала он просматривал вложенные папки, можно ли просто выполнить поиск в корне подключенных дисков? очень ценю ваши усилия.

2. @Tika9o9, это на самом деле значительно упрощает код и ускоряет его выполнение. Я полностью пропустил ваши спецификации в вашем вопросе. Мои извинения. Я вернусь с новым кодом.

3. не беспокойся, братан, у меня был отключенный диск, когда я тестировал, и это вызвало «не удается найти ошибку диска», поэтому игнорируйте это плохо. Просто настройте поиск папки сейчас, спасибо!!!

4. Впечатляет. Серьезно впечатляет. Большое спасибо. Смотрите, теперь я могу использовать это как переменную и использовать ее в файле конфигурации. Таким образом, имея предопределенную папку где-нибудь в общей папке, моя установка может быть практически полностью автоматизирована и настроена с автоматической загрузкой UNC!!!

5. Я собираюсь добавить код в свой существующий скрипт, в котором нет задержки setlocal? Это довольно просто, должен ли я добавить его ко всему сценарию сейчас или просто оставить его добавленным как начинающийся при запуске этого нового кода? Спасибо!!