gpt4 book ai didi

variables - : %%a and %variable% variables? 有什么区别

转载 作者:行者123 更新时间:2023-12-02 19:33:43 28 4
gpt4 key购买 nike

for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=a"') do ( set usemenu=a )
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=b"') do ( set usemenu=b )
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=c"') do ( set usemenu=c )

是的,在这段代码中(这可能不起作用,我想找出什么)我们在'for'命令中有这个“%%a”。

首先,%variable% 和 %%a 之间有什么区别?

其次,有人可以向我解释“for”命令吗?我在谷歌上搜索得太多了,所有的解释似乎都很复杂......

我想要做的是从 options.txt 中提取一个变量,这样我就可以更改游戏启动器的菜单样式。有 3 种样式(a、b 和 c),因此如果 options.txt 显示“menu=a”,我如何才能将 %usemenu% 之类的变量设置为 a 的值?

提前感谢您的任何帮助!

最佳答案

%variable% 是环境变量。它们设置为 set,可以使用 %foo%!foo! 访问(如果启用,则延迟扩展)。 %%a 是由 for 命令创建的特殊变量,用于表示当前循环项或当前行的标记。
for 可能是批处理文件中最复杂和最强大的部分。如果您需要循环,那么在大多数情况下 for 可以满足您的需求。 help for 有一个总结。

你可以

  • 迭代文件:for %x in (*.txt) do ...
  • 重复 n 次:for /l %x in (1, 1, 15) do...(参数是开始、步骤和结束)
  • 迭代一组值:for %x in (a, b, c) do ...
  • 遍历文件的行:for /f %x in (foo.txt) do ...
  • 标记文件的行:for /f "tokens=2,3* delims=," %x in (foo.txt) do ...
  • 迭代命令的输出:for /f %x in ('somecommand.exe') do ...

  • 这只是一个简短的概述。它变得更复杂,但请阅读帮助。
    %%a 形式的变量(如果 %a 在批处理文件之外使用,则为 for)与批处理文件和子程序( %1%2 、...)的参数非常相似。可以对它们应用某些类型的扩展,例如,如果变量表示带有路径的文件名,则仅获取文件名和扩展名,您可以使用 %%~nxahelp for 中给出了这些的完整概述。

    另一方面,环境变量还有其他一些特殊的东西。您可以通过 %foo:a=b% 在它们中执行替换将导致 %foo% ,除了每个 a 被替换为 b 。您也可以使用子字符串: %foo:~4,2% 。这些内容的描述可以在 help set 中找到。

    至于为什么 %variables%%%a 是不同的东西,这有点难以回答,可能只是历史上的古怪。如上所述,还有第三种变量 %1 等,它们与 for 中使用的变量非常相似,并且存在的时间更长,我猜。由于环境变量由于块而在 for 中使用有点笨拙,因此严重依赖延迟扩展,因此可能决定使用与参数相同的机制而不是环境变量。

    环境变量也可能更昂贵,因为该进程有一个特殊的“环境”内存块,它们存储在 variable=value␀ 对中,因此更新环境变量涉及潜在地复制一些内存,而其他类型的变量可能更多轻的。不过,这是猜测。

    至于你的问题,你真的不需要 for 在这里:
    find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=a" && set usemenu=a

    如果前面的命令成功,即找到 set,这只会运行 menu=a。这应该比 for 容易得多。从我读到的内容来看,您正在尝试查看 menu=a 是否存在于不包含冒号的行中,在这种情况下, usemenu 应该设置为 a ,对吗? (对于 bc 也是如此。您可以尝试通过循环文件或输出的行并适本地标记化以找出 for 的值来哄骗 menu 来做到这一点,但这取决于行的格式。如果这可能是你所拥有的理论上可行,那么你应该坚持下去。但是,您可以使用循环来避免对 abc 重复三遍同一行:
    for %%X in (a b c) do (
    find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=%%X" && set usemenu=%%X
    )

    但是,如果您解析的文件很简单,每行只有 name=value 对,其中 : foo 将是注释,那么您也可以使用 for :
    for /f "tokens=1,* eol=: delims==" %%A in (%appdata%\gamelauncher\options.txt) do (
    if "%%A"=="menu" set usemenu=%%B
    )

    但这在一定程度上取决于文件的确切格式。上面的代码片段现在将逐行读取文件,并且每行将丢弃冒号之后的所有内容( eol=: 选项),使用等号作为标记分隔符并捕获两个标记:第一个 = 之前的部分及其之后的所有内容。 token 以 %%A 开头,因此第二个 token 隐含地为 %%B(同样,这在 help for 中进行了解释)。现在,对于每一行,我们检查第一个标记并查看它是否是 menu,如果是,则将其值分配给 usemenu 变量。如果您有很多可能的选项来支持这当然更容易维护:-)。

    关于variables - : %%a and %variable% variables? 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15428777/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com