3

Я искал ответ повсюду и до сих пор никуда не деться.

Я хочу сделать следующее:

Сканирование моей локальной сети на наличие одной конкретной папки (имя которой я знаю) на любом компьютере. Эта папка всегда доступна всем. При обнаружении сопоставьте его с неиспользуемой буквой диска в Windows.

Пробовал эту опцию из другого вопроса в stackoverflow, просто чтобы найти папку и хост, но безуспешно:

@echo off
set folder=example
for /f %%a in ('net view ^|find "\\"') do if not "%%a"=="\\%computername%" (
    echo trying server "%%a"
    pushd "%%a" && (
             for /d /r %%b in (%folder%*) do if /i "%%~nxb"=="%folder%" echo server "%%a" folder "%%b"
             popd
            )
)
pause

Заранее спасибо!

1 ответ1

1

Read pushd - UNC Сетевые пути:

Если указан путь UNC , PUSHD создаст временную карту дисков и затем будет использовать этот новый диск.
Временные буквы дисков располагаются в обратном алфавитном порядке, поэтому, если Z: свободна, она будет использоваться первой.

pushd "%%a" неверен, так как pushd требует UNC-путь, такой как \\computername\sharename или \\computername\sharename\some\subfolder (см. Также net use), тогда как "%%a" оценивает только \\computername .

Следующий скрипт (с некоторыми незначительными улучшениями) должен выполнить эту работу. Прочитайте класс Win32_Share и wmic.exe для справки.

@ECHO OFF >NUL
SETLOCAL EnableExtensions DisableDelayedExpansion
set "folder=example"
for /f %%a in ('net view ^|find "\\"') do if not "%%a"=="\\%computername%" (
    echo server: "%%a"
    set "_server=%%a"
    call :tryServer
)
ENDLOCAL
goto :eof

:tryServer
  for /F "tokens=2 delims=," %%G in ('
    wmic /node:"%_server:~2%" Share where "Status='OK' and Type=0" get name^, type /Format:csv
                                     ') do (
        echo trying "%_server%\%%~G"
        pushd "%_server%\%%~G" && (
            for /d /r %%b in ("%folder%*") do (
                if /i "%%~nxb"=="%folder%" echo FOUND: "%_server%\%%~G" folder "%%b"
            )
            popd
        )
  )
goto :eof

Обратите внимание, что двойные кавычки for /d /r %%b in ("%folder%*") do … необходимы для правильной обработки даже имени папки, содержащей пробелы, например, set "folder=foo bar" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .