批处理文件 - 从文件内容中提取路径到 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
,如果%%a
是personal
,那么%%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
将使用冒号和反斜杠作为分隔符拆分元素并尝试找到第四个标记。由于行中唯一带有四个标记的元素是路径...
- 我们将变量设置为元素的完整路径
我希望有人能提供帮助。
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
,如果%%a
是personal
,那么%%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
将使用冒号和反斜杠作为分隔符拆分元素并尝试找到第四个标记。由于行中唯一带有四个标记的元素是路径...- 我们将变量设置为元素的完整路径