我一直在寻找答案但至今仍无所获。
我希望做到以下几点:
在任何计算机上扫描我的 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
提前致谢!
答案1
当一个UNC 路径指定后,
PUSHD
将创建一个临时驱动器映射,然后使用该新驱动器。
临时驱动器号按字母逆序分配,因此如果Z:
有空闲,将首先使用它。
这pushd "%%a"
是不正确的,因为pushd
需要UNC 路径喜欢 \\computername\sharename
或\\computername\sharename\some\subfolder
(另见net use
) 而"%%a"
仅评估为\\computername
。
下面的脚本(略有改进)应该可以完成这项工作。阅读Win32_Share 类和执行程序以供参考。
@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"
。