需要从文本文件中提取字符串以用作变量[关闭]

问题描述 投票:0回答:1

我需要提取特定文本以放入变量中,但我还需要删除字符。

我提取映射驱动器的注册表信息并清理文件。使用 FINDSTR /v 我得到以下文本文件。

[HKEY_CURRENT_USER\Network\h]
"RemotePath"="\\\\server\\folder1\\folder2"
[HKEY_CURRENT_USER\Network\i]
"RemotePath"="\\\\server2\\folder1"
[HKEY_CURRENT_USER\Network\j]
"RemotePath"="\\\\server3\\folder1"

我需要提取驱动器号和 RemotePath,但还需要删除多余的反斜杠,以便这些变量可用于在新计算机上重新映射。

batch-file
1个回答
0
投票

这里是处理文件中ANSI编码注册表数据的演示

RegistryData.txt
:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "RegistryData.txt" goto EndBatch
set "DriveLetter="
for /F "usebackq tokens=1* delims=[]=" %%I in ("RegistryData.txt") do (
    if "%%~I" == "RemotePath" (
        set "FolderPath=%%~J"
        setlocal EnableDelayedExpansion
        echo Drive !DriveLetter!: mapped to "!FolderPath:\\=\!"
        endlocal
        set "DriveLetter="
    ) else for /F "tokens=3 delims=\" %%# in ("%%I") do set "DriveLetter=%%#"
)
:EndBatch
endlocal

外部 FOR 循环逐行处理注册表数据文件中的一行。它使用方括号和等号作为字符串分隔符将每行分成两个子字符串。如果存在第二个子字符串,则根据

ASCII 表
,将第一个子字符串(标记)分配给指定的循环变量
I
,并将第二个子字符串分配给下一个循环变量 J

具有完整路径的注册表项(= 驱动器号)被分配给以分隔符

I
开头并以分隔符
[
结尾的行的循环变量
]
。这样的行由内部 FOR 循环进一步处理,该循环处理分配给循环变量
I
的字符串,方法是使用
\
作为字符串分隔符将其拆分为子字符串,并将第三个子字符串分配给指定的循环变量
#
。该字符串值被分配给环境变量
DriveLetter

带双引号的字符串

"RemovePath"
由外部
FOR
分配给循环变量 I,用于具有注册表字符串值
RemovePath
的行,并且带双引号的远程文件夹路径分配给循环变量
J
,其中甚至可以包含
[
]
=
一次或多次,因为
*
之后的
tokens=1
意味着不要在第一个子字符串之后进一步将行拆分为子字符串。

将文件夹路径分配给环境变量

FolderPath
,并删除周围的双引号。然后根据需要启用延迟扩展,以引用在命令块内定义的环境变量
DriveLetter
FolderPath
的字符串值,在执行外部
FOR
循环之前由cmd完全解析。

驱动器盘符和文件夹路径通过 ECHO 输出,使用延迟扩展,将文件夹路径中所有出现的两个反斜杠替换为单个反斜杠。

然后使用命令ENDLOCAL恢复之前的执行环境,并再次禁用延迟扩展,这对于注册表数据中包含一个或多个感叹号的文件夹路径是必需的。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.