首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将配置文件转换为变量,并将正斜杠转换为反斜杠

将配置文件转换为变量,并将正斜杠转换为反斜杠
EN

Stack Overflow用户
提问于 2017-05-10 00:10:33
回答 3查看 117关注 0票数 0

我的bash脚本需要一个配置文件,它有一个布局:

代码语言:javascript
复制
A=C:/Example1/A
B=C:/Example2/B
C=C:/Example3/C

我想对我的windows批处理文件使用相同的配置文件。我需要将上面的文件转换为变量,我已经使用:

代码语言:javascript
复制
for /f "delims=" %%x in (test.txt) do (set "%%x")

如何将此文件转换为变量,同时将所有正斜杠转换为反斜杠?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2017-05-10 00:59:45

添加到您的for行之后,

代码语言:javascript
复制
for /f "delims==" %%x in (q888.txt) do call set "%%x=%%%%x:/=\%%"

或者,作为现有for的替代品,

代码语言:javascript
复制
for /f "tokens=1*delims==" %%x in (q888.txt) do set "%%x=%%y"&call set "%%x=%%%%x:/=\%%"

(我使用了一个名为q888.txt的文件进行测试)

第一个smply使用解析技巧执行替换。第二个命令通过将=上的标记转换为%%x%%y,将设置和替换合并到一个级联命令中

票数 1
EN

Stack Overflow用户

发布于 2017-05-10 01:11:16

这可以使用以下批处理代码来完成:

代码语言:javascript
复制
@echo off
if not exist "test.txt" goto :EOF
setlocal EnableDelayedExpansion

for /F "usebackq tokens=1* delims==" %%I in ("test.txt") do (
    if not "%%~J" == "" (
        set "Value=%%~J"
        set "Value=!Value:/=\!"
        set "_%~n0_%%~I=!Value!"
    )
)

echo The variables set from file are:
echo/
set "_%~n0_"
echo/
pause

endlocal

批处理文件首先检查当前目录中是否存在要处理的文件。如果文件test.txt根本不存在,则会跳转到预定义的标签EOF (文件结束,需要启用的扩展名,默认情况下启用),从而退出批处理文件处理。

接下来,使用的命令逐行读取文件,跳过空行和以分号开头的行,该命令将每行拆分为两个字符串。

第一个等号左边的第一个字符串被赋值给循环变量I。第一个等号右边的所有内容都根据ASCII表分配给下一个循环变量J

循环中的 if 条件检查是否也为变量定义了值。该值被分配给一个环境变量,在该环境变量上使用延迟扩展执行字符串替换,以将所有/替换为\

然后,将修改后的值赋给环境变量,环境变量的名称以_开头,批处理文件的名称,再加一个下划线,并将字符串分配给从文件中读取的循环变量I

为了演示,在执行最后一个命令ENDLOCAL时,在丢弃局部变量之前,最终输出变量及其值。

我强烈建议不要将从文件中读取的值直接赋给其名称也完全从文件中读取的环境变量,因为这使得只需修改文本文件的内容就可以很容易地操作批处理文件。例如,文本文件中的path=C:\Temp将导致set "Path=C:\Temp",并且从执行批处理文件的这一点开始,运行Windows命令的进程将无法在环境变量PATH (如%SystemRoot%\System32 )中默认定义的目录中找到任何标准可执行文件。

第二个变体将Magoo发布的答案与上面的批次代码结合在一起:

代码语言:javascript
复制
@echo off
if not exist "test.txt" goto :EOF
setlocal DisableDelayedExpansion

for /F "usebackq tokens=1* delims==" %%I in ("test.txt") do if not "%%~J" == "" set "_%~n0_%%~I=%%~J" & call set "_%~n0_%%~I=%%_%~n0_%%~I:/=\%%"

echo The variables set from file are:
echo/
set "_%~n0_"
echo/
pause

endlocal

这个变型的优点是,这种解决方案不需要延迟扩展,这使得可以纠正文件中包含一个或多个感叹号的行,第一个变型在这些行上失败。而且它也更快一点,对人类来说不是很明显,但还是快了一点。

在这两个批处理代码块中,_%~n0_可以替换为(几乎)任何内容,也包括任何内容,尽管不推荐这样做。只使用下划线也是可能的,因为Windows默认情况下没有定义以下划线开头的环境变量。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /? ...解释%~n0 (参数0的名称-批处理文件名-不带路径和文件extension).
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?
票数 0
EN

Stack Overflow用户

发布于 2017-05-10 10:22:50

最简单的解决方案是让变量修饰符的~f以规范的形式放置完整路径(包括将正斜杠转换为反斜杠)。我使用DELIMS和TOKENS选项将每一行拆分为变量名和路径,以便可以将~f应用于路径。在路径包含=字符的情况下,使用tokens=1*而不是tokens=1,2是很重要的。

代码语言:javascript
复制
for /f "delims== tokens=1*" %%A in (test.txt) do (set "%%A=%%~fB")

但是,请注意,只有当您的"test.txt“已经包含完整的绝对路径时,此策略才有效。如果文件包含相对路径,则~f修改器将添加当前目录中的驱动器和/或文件夹值,以将相对路径转换为绝对路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43874877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档