【发布时间】:2021-11-14 20:28:52
【问题描述】:
我想通过批处理脚本访问 JSON 文件的内容以对其进行一些处理。我的脚本是这样的:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
@setlocal enableextensions
@cd /d "%~dp0"
...
...
...
set FILEPATH=C:\\PROGRA~1\\Setup\\setup.json
IF EXIST "%FILEPATH%" (
set string=
for /f "delims=" %%x in (C:\\PROGRA~1\\Setup\\setup.json) do set "string=!string!%%x"
echo !string!
//do some processing on string variable
)
...
...
此脚本应返回文件内容,但它会打印此脚本中设置的所有环境变量和变量。
echo !string! 返回 ECHO 关闭(表示字符串为空)。
如果我在if() 之外运行此代码,那么它会给出正确的结果(即文件内容)。
set string=
for /f "delims=" %%x in (C:\\PROGRA~1\\Setup\\setup.json) do set "string=!string!%%x"
echo !string!
那么我在这里错过了什么?
【问题讨论】:
-
您分配了
FILEPATH,但不使用它,if exist除外。有什么特别的原因可以将所有反斜杠加倍吗?您可以通过为它指定两个参数来将两个setlocal命令合并为一个... -
@aschipfl 实际上我首先检查 setup.json 所在的目录是否存在。所以我需要先检查目录是否存在,并在此基础上完成一些操作。但它也有助于确定 setup.json 是否存在。因此,如果 "C:\\PROGRA~1\\Setup\\" 存在,那么 setup.json 也将存在。在这里我写了 ``` set FILEPATH=C:\\PROGRA~1\\Setup\\setup.json ``` 以避免问题标题和我在脚本中所做的任何混淆。我使用了“\\”,因为带有“\”的路径没有得到解决并给我错误。
-
您确定
PROGRA~1是正确的吗?除非绝对必要,否则不应使用短名称(此处没有必要:for /f "usebackq delims=" %%x in ("C:\PROGRAM FILES\Setup\setup.json") do...或for /f "usebackq delims=" %%x in ("C:\PROGRAM FILES (x86)\Setup\setup.json") do...) -
@Stephan 是的。我已经试过了。但仍然只是打印出环境变量,因此认为空白可能存在问题,这就是我使用 PROGRA~1 的原因。
-
@Stephan 我已将 Setup 文件夹放在“Program Files”中,因此在 Program Files(x86) 中查找它们毫无意义。
标签: windows file batch-file cmd