我需要提取特定文本以放入变量中,但我还需要删除字符。
我提取映射驱动器的注册表信息并清理文件。使用 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,但还需要删除多余的反斜杠,以便这些变量可用于在新计算机上重新映射。
这里是处理文件中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 /?