我有一个配置文件,我需要的bash脚本有一个布局:
A=C:/Example1/A
B=C:/Example2/B
C=C:/Example3/C
我想为我的Windows批处理文件使用相同的配置文件。我需要将上面的文件转换为我使用过的变量:
for /f "delims=" %%x in (test.txt) do (set "%%x")
如何将此文件转换为变量,同时将所有正斜杠转换为反斜杠?
谢谢!
答案 0 :(得分:1)
在for
行之后添加
for /f "delims==" %%x in (q888.txt) do call set "%%x=%%%%x:/=\%%"
或作为现有for
的替代,
for /f "tokens=1*delims==" %%x in (q888.txt) do set "%%x=%%y"&call set "%%x=%%%%x:/=\%%"
(我使用了一个名为q888.txt
的文件进行测试)
第一个使用解析技巧轻松执行替换。第二个将集合和替换组合成一个级联命令,方法是将=
标记为%%x
和%%y
答案 1 :(得分:0)
可以使用以下批处理代码完成此操作:
@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
批处理文件首先检查当前目录中是否存在要处理的文件。退出批处理文件处理时会跳转到预定义标签EOF
(文件末尾,需要启用默认启用的扩展名),以防文件test.txt
根本不存在。
接下来,逐行读取文件,跳过空行和以分号开头的行 FOR ,将每行分成两个字符串。
第一个等号左边的第一个字符串被赋给循环变量I
。根据ASCII表,为第一个等号的所有权利分配下一个循环变量J
。
循环中的 IF 条件检查是否还为变量定义了值。该值将分配给环境变量,在该环境变量上使用延迟扩展执行字符串替换,以将所有/
替换为\
。
然后将修改后的值分配给名称以_
开头的环境变量,批处理文件的名称,另一个下划线和分配给循环变量I
的字符串从文件中读取
为了演示,在执行最后一个命令 ENDLOCAL 时丢弃局部变量之前,最终输出带有其值的变量。
我强烈建议不要将从文件中读取的值直接分配给名称完全也从文件中读取的环境变量,因为这样只需修改文本文件的内容就可以轻松操作批处理文件。例如,文本文件中的path=C:\Temp
否则会导致set "Path=C:\Temp"
,从批处理文件执行的这一点开始,运行的Windows命令进程将无法在环境变量{{1}中默认定义的目录中找到任何标准可执行文件。像PATH
一样。
第二个变体,其中包含Magoo发布的答案和上面的批次代码:
%SystemRoot%\System32
此变体的优点是此解决方案不需要延迟扩展,这使得可以从包含第一个变体失败的1个或多个感叹号的文件中校正过程。它也快一点,对人类来说速度不快,但速度要快一点。
在两个批处理代码块@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
中都可以替换为(几乎)任何东西,包括也没有,尽管不推荐。也可以只使用下划线,因为Windows默认没有定义环境变量,以下划线开头。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
_%~n0_
...解释call /?
(参数0的名称 - 批处理文件名 - 没有路径且没有文件扩展名。)%~n0
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
set /?
答案 2 :(得分:0)
最简单的解决方案是让~f
FOR变量修饰符以规范形式放置完整路径(包括将正斜杠转换为反斜杠)。我使用DELIMS和TOKENS选项将每一行拆分为变量名称和路径,以便我可以将~f
应用于路径。如果路径包含tokens=1*
字符,请务必使用tokens=1,2
代替=
。
for /f "delims== tokens=1*" %%A in (test.txt) do (set "%%A=%%~fB")
但请注意,此策略仅适用于您的" test.txt"已包含完整的绝对路径。如果文件包含相对路径,则~f
修饰符将从当前目录添加驱动器和/或文件夹值,以将相对路径转换为绝对路径。