从文本文件中删除字符串

时间:2014-06-06 04:10:48

标签: string batch-file data-manipulation

我正在尝试从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>

非常感谢任何帮助,提前谢谢。

2 个答案:

答案 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处理令牌时出现问题。现在更正了