#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:
Следующий фрагмент кода должен работать даже из командной строки с повышенными правами:
@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? Это довольно просто, должен ли я добавить его ко всему сценарию сейчас или просто оставить его добавленным как начинающийся при запуске этого нового кода? Спасибо!!