web-dev-qa-db-ja.com

ネットワーク内の特定の共有フォルダを見つける方法

私はずっと答えを探していましたが、今のところどこにも行きませんでした。

私は次のことをしたいと思います:

任意のコンピューターで、LANをスキャンして特定のフォルダー(名前はわかっています)を探します。このフォルダは常に全員にフルアクセスで共有されます。見つかったら、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

前もって感謝します!

読み取り pushd --UNCネットワークパス

UNCパスが指定されている場合、PUSHDは一時的なドライブマップを作成し、その新しいドライブを使用します。
一時的なドライブ文字はアルファベットの逆順で割り当てられるため、_Z:_が空いている場合は、最初に使用されます。

pushdには_pushd "%%a"_や_\\computername\sharename_のようなUNCパスが必要なため、_\\computername\sharename\some\subfolder_は正しくありません( も参照) _Net Use_ )一方、_"%%a"_は_\\computername_にのみ評価されます。

次のスクリプト(いくつかのマイナーな機能強化を含む)がその仕事をするはずです。参照用に Win32_Share class および 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"_のようなスペースを含むフォルダー名でも正しく処理するために必要であることに注意してください。

1
JosefZ