我正在尝试从net use命令中仅获取驱动器号和驱动器路径。问题是,我可以得到驱动器号和路径,但在我的循环中,我还得到一个“Microsoft Windows网络”字符串。
我已经开始使用tokens = 2,3,但不幸的是,切掉了我不想要的驱动路径中的任何空格。
所以我要问的是,有没有办法从变量或文本文件中删除字符串。我已经尝试过使用findstr / v但是删除了整行,这也是不可取的。
:GetDrives
setlocal EnableDelayedExpansion
@echo off
cls
set i=0
for /F "tokens=2,*" %%a in ('net use ^| Find "\\"') do (
set /A i+=1
set array1[!i!]=%%a
set array2[!i!]=%%b
)
set n=%i%
for /L %%i in (1,1,%n%) do echo !array1[%%i]! !array2[%%i]! >> DriveFile.txt
pause
GOTO:EOF
以下是我目前获得的内容以及我希望获得的内容。
净使用脚本:
Status Local Remote Network
----------------------------------------------------------------------------
OK H: \\Server\User$\UID Microsoft Windows Network
OK X: \\Server\Folder\Folder Microsoft Windows Network
OK Z: \\Server\Folder\Folder Name
Microsoft Windows Network
The command completed successfully.
这是我的代码在DriveFile.txt中的当前输出:
X: \\Server\Folder\Folder Microsoft Windows Network
Z: \\Server\Folder\Folder Name
当我使用/ F“tokens = 2,3”时会发生这种情况:
X: \\Server\Folder\Folder
Z: \\Server\Folder\Folder
这是我想看到的:
X: \\Server\Folder\Folder
Z: \\Server\Folder\Folder Name
但是也希望它延伸出超过4个令牌,所以如果文件路径映射到Z驱动器说“\ server \ Folder Name \ Folder Name \ Folder Name”,我仍然会获得完整的文件路径。< / p>
非常感谢任何帮助,提前谢谢。
答案 0 :(得分:0)
for /f "tokens=2-3" %A in ('net use^|findstr /i /c:"\\"')do echo %A %B
for /f "tokens=1-2* delims=:\" %A in ('net use^|findstr /i /c:"\\"') do echo %A: \\%B %C %D %E
答案 1 :(得分:0)
不幸的是它比看起来更难。
Status
字段可以保存信息或为空。
Network
字段可以有多个值,具体取决于网络映射。在我的情况下,我有&#34; Microsoft Windows网络&#34;和#34; Netware Services&#34;。所以,没有直接替代。
Network
字段可以与Remote
字段位于同一行,也可以位于下一行,并且Remote
字段可能包含空格,请检查列限制位置的字符不可靠。有必要延迟检查,直到下一行被引用,以确定它是否包含远程数据。
当然,可以做到,但有太多的情况需要处理。一些替代选项,以及对问题的回答是:
@echo off
setlocal enableextensions enabledelayedexpansion
:: Option 1 - Enumerate and ask each drive
for /f "delims=:" %%a in ('net use ^| find ":"') do (
for /f "tokens=2" %%b in ("x%%a") do set "drive=%%b"
for /f "tokens=2,* delims=\" %%b in ('net use !drive!:'
) do echo(!drive!: \\%%b\%%c
)
echo -----------------------------------------------
:: Option 2 - Ask WMI
for /f "tokens=2,3 delims=," %%a in (
'wmic netuse get LocalName^, RemoteName^, Status /format:csv ^| find ":"'
) do echo(%%a %%b
echo -----------------------------------------------
:: Option 3 - Only one net use command
set "drive="
set "remote="
for /f "skip=6 delims=" %%a in ('net use') do (
for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
if "%%c"=="" (
if defined drive (
echo(!drive! !remote!
set "drive="
set "remote="
)
) else (
if defined drive echo(!drive! !remote:~0,26!
for /f "tokens=2" %%d in ("x%%b") do (
set "drive=%%d:"
for /f "tokens=2,* delims=\" %%e in ("%%c") do set "remote=\\%%e\%%f"
)
)
)
)
if defined drive echo(!drive! !remote:~0,26!
第一个选项使用第一个net use
命令来获取驱动器列表以及每个驱动器列表(小心,状态字段可以为空,因此第二个for用于检索字母)驱动器号检索并用于发出新的net use x:
命令以检索路径。
在第二个选项中,wmic
用于从WMI检索信息。
第三个选项是原始问题。如何解析net use
命令。
第一个选项较慢(每个驱动器有一个初始net use
和一个net use x:
)但第二个选项虽然速度更快,但需要管理员权限。第三种选择是噩梦,但速度很快,不需要附加权利。
已编辑选项1处理令牌时出现问题。现在更正了