批处理文件 - 将路径从文件内容提取到 cmd 变量中



我希望有人能帮上忙。

Dropbox 将其路径存储在名为"info.json"的文件中。 我的文件内容如下:

{"personal": {"path": "C:\Users\Sam\Dropbox", "host": 241656592}}
{"business": {"path": "C:\Common\Allusers\Dropbox", "host": 45143292}}

我只需要使用Windows批处理脚本将"个人"路径提取到Windows CMD变量%dropboxpath%。 我尝试过使用 FOR 和 FINDSTR,但无法使其工作。

另一个问题是去掉路径中多余的反斜杠以留下"C:\Users\Sam\Dropbox"。

我相信 FINDSTR 应该找到"个人"行,FOR 应该提取"路径"之后的所有内容:但在 "host" 之前,然后以某种方式删除双反斜杠。

希望这是有道理的,并非常感谢您能提供的任何帮助。

非常感谢,山姆

@echo off
    setlocal enableextensions disabledelayedexpansion
    set "file=info.json"
    for /f usebackq^ tokens^=2^,6^ delims^=^" %%a in ("%file%") do (
        if /i "%%a"=="personal" set "dropboxpath=%%~fb"
    )
    echo %dropboxpath%

使用引号作为分隔符,拆分行,因此分隔符和标记是

{"personal": {"path": "C:\Users\Sam\Dropbox", "host": 241656592}}    
 ^        ^   ^    ^  ^                       ^  ^    ^
1 2        3   4    5  6                       7  8    9

我们请求第四和第六个令牌进入%%a%%b,如果%%apersonal,那么路径%%b

或者,您可以尝试使用

@echo off
    setlocal enableextensions disabledelayedexpansion
    set "file=info.json"
    for /f "delims=" %%a in ('findstr /l /i /c:"{"personal"" "%file%"'
    ) do for %%b in (%%a
    ) do for /f "tokens=4 delims=:" %%c in ("%%~b"
    ) do set "dropboxpath=%%~fb"
    echo %dropboxpath%
  • findstr用于在输入文件中查找所需的行。此行由...
  • for /f %%a谁调用了findstr命令。对于每个检索到的行...
  • for %%b将迭代存储在%%a中的行中的元素,并为每个...
  • for /f %%c将使用冒号和反斜杠作为分隔符来拆分元素,并尝试查找 fouth 标记。由于行中具有四个标记的唯一元素是路径...
  • 我们将变量设置为元素的完整路径
@ECHO OFF
SETLOCAL
FOR /f "tokens=1,3*delims={:" %%a IN (q29817666.txt) DO IF /i "%%~a"=="personal" (
 FOR %%p IN (%%c) DO SET "dropboxpath=%%~p"&GOTO process
)
:process
SET "dropboxpath=%dropboxpath:\=%"
ECHO dropboxpath=%dropboxpath%
GOTO :EOF

我使用了一个名为 q29817666.txt 的文件,其中包含您的数据进行测试。

令牌/分隔符组合选择"personal"%%a, a space to %%b and "C:\Users\Sam\Dropbox", "host": 241656592}}to%%c'

如果%%a(去掉括起来的引号)等于字符串personal . 然后%%c处理为由空格和逗号分隔的一系列元素。由于第一个元素是感兴趣的并且它被引用,那么%%p将获取"C:\Users\Sam\Dropbox",并且剥离封闭引号将被分配给变量dropbox,然后循环由goto终止。

然后将双反斜杠

替换为单反斜杠。做。

由于您需要在运行时而不是解析时修改和评估变量,因此需要使用 EnableDelayedExpansion!...! 而不是 %...% 。但是,如果您发布的两行正确,则此代码将起作用。

@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%a IN (scanword.txt) DO (
    SET line=%%a
    IF "!line:~2,8!"=="personal" SET dropboxpath=%%a
)
FOR /F "tokens=3" %%a IN ("!dropboxpath!") DO (
    SET dropboxpath=%%a
)
SET dropboxpath=!dropboxpath:"=!
SET dropboxpath=!dropboxpath:,=!
SET dropboxpath=!dropboxpath:\=!
ECHO !dropboxpath!
PAUSE

该路径将存储在!dropboxpath!中,而不是按照您的要求存储在%dropboxpath%中,但我希望没关系;-)

最新更新