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

Batchfile - extract path from file contents into cmd variable

我希望有人能提供帮助。

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

{"personal": {"path": "C:\Users\Sam\Dropbox", "host": 241656592}}

{"business": {"path": "C:\Common\Allusers\Dropbox", "host": 45143292}}

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

另一个问题是去除路径中多余的反斜杠以离开 'C:\Users\Sam\Dropbox'。

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

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

非常感谢,山姆

由于您需要在 运行 时而不是在解析时修改和评估变量,因此您需要使用 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% 但我希望没问题 ;-)

@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 的文件,其中包含您的数据用于我的测试。

tokens/delimiters组合选择"personal"%%a, a space to%%band"C:\Users\Sam\Dropbox","host":241656592}}to%%c`

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

然后将双反斜杠替换为单反斜杠。完成。

@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 将使用冒号和反斜杠作为分隔符拆分元素并尝试找到第四个标记。由于行中唯一带有四个标记的元素是路径...
  • 我们将变量设置为元素的完整路径