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

时间:2015-04-23 08:22:27

标签: variables batch-file extract

我希望有人可以提供帮助。

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应该找到个人' line和FOR应该在" path"之后提取所有内容,但之前," host"然后以某种方式,删除双反斜杠。

希望这是有道理的,非常感谢你能给予的任何帮助。

非常感谢,Sam

3 个答案:

答案 0 :(得分:1)

@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&# 34;:241656592}} to %% c`

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

然后用单个替换双反斜杠。完成。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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