AutoHotKey:通过关联数组循环
AutoHotKey: Loop thru Associative Array
很高兴回到论坛!
因此,在 AHK 文档、stackexchange 和 ahk_forum 中进行了广泛搜索后,我决定寻求专家的帮助
我将解释我正在处理的代码,然后 post 一些示例。
我编写了一个脚本,用于提取 6 个不同单词文件中未翻译和未验证单词的值,并通过 WebTranslateIt(站点)为 23 种不同语言执行此操作。我已经设法通过处理代码块并将 "fileid" 变量设置为每个新查询之前的 6 个文件之一来使其工作,但是当我到达语言迭代部分时,我很快注意到它会是简单地让一个循环中的一个循环遍历两个数组直到数组结束会更有效(并且代码明显更少)。
此脚本使用 Google Chrome 访问网站,然后继续将几个 jQuery 注入开发人员工具并将结果提取到独立命名的变量中(我想将其分配为关联数组)。
这是我遇到问题的部分...我可以通过以下方式成功循环数组:
langid := ["bg", "cs", "da", "el", "eu", "fi", "hr" , "ja", "ko", "lt", "nb",
"nl", "pl", "pt", "ro" , "ru", "sk", "sl", "sv", "th" , "tr", "zh", "zh-Hant"]
For Key, Value in langid
; MsgBox, %A_Index% = %Value% ; the MsgBox displays index values correctly but when putting my script in a loop start after the For Key part, it does not provide a value when sending the var inside a url. This works fine when I set the var manually before sending the URL.
但是当我在循环执行主要查询的脚本之前尝试 运行 时,我发送以更改语言的 URL 中的 'langid' 变量是空白的。
我想在所有语言中循环脚本 23 次。当脚本进入循环时,有一个部分以 %langid% 进入页面 URL,我无法让这部分与上面的代码一起工作。
除此之外,我还想为索引中的每个键分配更多值,如下所示:
langid := ["bg", "cs", "da", "el", "eu", "fi", "hr" , "ja", "ko", "lt", "nb",
"nl", "pl", "pt", "ro" , "ru", "sk", "sl", "sv", "th" , "tr", "zh", "zh-Hant"]
lang := ["Bulgarian", "Czech", "Danish", "Greek", "Basque", "Finnish",
"Hungarian", "Japanese", "Korean", "Lithuanian", "Norwegian", "Dutch",
"Polish", "Portuguese", "Romanian", "Russian"]
'lang' 数组应该引用 'langid' 中的索引位置,因为我在一些显示字数统计进度的 MsgBox 中将其用作描述性变量,并在末尾使用一个函数写入总数每种语言 6 个文件的结果。 (这纯粹是美学的,但我很乐意让它在循环中工作)
我还需要与 wordfiles 非常相似的东西:
filenum := ["342553", "342582", "342411", "342367", "342467", "342502"]
wrdfile := ["OHFrontend", "OHFrontendListing", "HouseTypeAndSubType", "GuestType", "RoomTypeFeatureName", "RoomTypeFaturePrefixAndBracketOption"]
'wrdfile' 数组也纯粹是为了美观,因为我宁愿在总计确认中显示文件名而不是文件编号。然而,'filenum' 很重要,需要遍历数组中的每个值一次,直到到达末尾,此时它需要重新启动,但使用 'lang' 数组中的下一种语言。
我认为以下结构可行:
langid := [val1, val2, etc..]
lang := [val1, val2, etc..]
For Key, Value in langid ; iterate through Languages
Loop
{
filenum := [val1, val2, etc...]
wrdfile := [val1, val2, etc...]
Run Chrome
Open Site
For Key, Value in filenum ;iterate through Wordfiles
Loop
{
Send URL containing 'langid' var & 'filenum' var
Open DevTools and send jQuery and store totals
Confirm totals in MsgBox and save in txt file
}
Return
值得注意的是,所有语言都需要遍历相同的 6 个单词文件,因此也许文件数组也可以是第一个关联数组的一部分,而不是两个不同的数组...?不确定这里最好的方法是什么。
请帮我找到循环的正确结构和语法,如果可能的话,请为我指出正确的方向,就数组而言。 (我知道我没有正确关联它们)
我需要有关形成关联数组的帮助...我查阅的文档和示例不够详尽。请至少帮助推动正确的方向:oops:
我需要有关 For Key 命令的帮助。它应该通过它下面的循环,在每次迭代中提供下一个 'langid' 值,直到最后一个值 ("zh-Hant").
一旦第 2 点开始工作,我将调整脚本以循环遍历 6 个单词文件,然后重复语言。我的目的是循环遍历每种语言的 6 个单词文件。一旦它开始工作,我将添加一个小的 GUI 提示以允许通过整个循环或仅通过特定语言。
Link to AHK_Forum post containing full code.
再次感谢!
您可以为您的语言和文件变量使用关联数组。关联数组的正确语法如下。
object := { "key1" : "value", "key2" : "value 2" }
您可以像这样使用 for 循环遍历数组。
for key, value in object
MsgBox key: %key% value: %value%
for 循环已经遍历了您的对象,因此您不需要它下面的循环。如果我对你的理解正确,你可以尝试这样的事情。
; Associative arrays
Langs := { "bg" : "Bulgarian", "cs" : "Czech" }
Files := { "342553" : "OHFrontend", "342582" : "OHFrontendListing"}
; Open Chrome
For langId, langName in Langs
{
For fileId, fileName in Files
{
url := "example.com/" . langId . "/" . fileId
; Send url with langId & fileId
; Open DevTools and send jQuery and store totals
; Confirm totals in MsgBox and save in txt file
msgbox %url%
}
}
Return
很高兴回到论坛!
因此,在 AHK 文档、stackexchange 和 ahk_forum 中进行了广泛搜索后,我决定寻求专家的帮助
我将解释我正在处理的代码,然后 post 一些示例。
我编写了一个脚本,用于提取 6 个不同单词文件中未翻译和未验证单词的值,并通过 WebTranslateIt(站点)为 23 种不同语言执行此操作。我已经设法通过处理代码块并将 "fileid" 变量设置为每个新查询之前的 6 个文件之一来使其工作,但是当我到达语言迭代部分时,我很快注意到它会是简单地让一个循环中的一个循环遍历两个数组直到数组结束会更有效(并且代码明显更少)。
此脚本使用 Google Chrome 访问网站,然后继续将几个 jQuery 注入开发人员工具并将结果提取到独立命名的变量中(我想将其分配为关联数组)。
这是我遇到问题的部分...我可以通过以下方式成功循环数组:
langid := ["bg", "cs", "da", "el", "eu", "fi", "hr" , "ja", "ko", "lt", "nb",
"nl", "pl", "pt", "ro" , "ru", "sk", "sl", "sv", "th" , "tr", "zh", "zh-Hant"]
For Key, Value in langid
; MsgBox, %A_Index% = %Value% ; the MsgBox displays index values correctly but when putting my script in a loop start after the For Key part, it does not provide a value when sending the var inside a url. This works fine when I set the var manually before sending the URL.
但是当我在循环执行主要查询的脚本之前尝试 运行 时,我发送以更改语言的 URL 中的 'langid' 变量是空白的。
我想在所有语言中循环脚本 23 次。当脚本进入循环时,有一个部分以 %langid% 进入页面 URL,我无法让这部分与上面的代码一起工作。
除此之外,我还想为索引中的每个键分配更多值,如下所示:
langid := ["bg", "cs", "da", "el", "eu", "fi", "hr" , "ja", "ko", "lt", "nb",
"nl", "pl", "pt", "ro" , "ru", "sk", "sl", "sv", "th" , "tr", "zh", "zh-Hant"]
lang := ["Bulgarian", "Czech", "Danish", "Greek", "Basque", "Finnish",
"Hungarian", "Japanese", "Korean", "Lithuanian", "Norwegian", "Dutch",
"Polish", "Portuguese", "Romanian", "Russian"]
'lang' 数组应该引用 'langid' 中的索引位置,因为我在一些显示字数统计进度的 MsgBox 中将其用作描述性变量,并在末尾使用一个函数写入总数每种语言 6 个文件的结果。 (这纯粹是美学的,但我很乐意让它在循环中工作)
我还需要与 wordfiles 非常相似的东西:
filenum := ["342553", "342582", "342411", "342367", "342467", "342502"]
wrdfile := ["OHFrontend", "OHFrontendListing", "HouseTypeAndSubType", "GuestType", "RoomTypeFeatureName", "RoomTypeFaturePrefixAndBracketOption"]
'wrdfile' 数组也纯粹是为了美观,因为我宁愿在总计确认中显示文件名而不是文件编号。然而,'filenum' 很重要,需要遍历数组中的每个值一次,直到到达末尾,此时它需要重新启动,但使用 'lang' 数组中的下一种语言。
我认为以下结构可行:
langid := [val1, val2, etc..]
lang := [val1, val2, etc..]
For Key, Value in langid ; iterate through Languages
Loop
{
filenum := [val1, val2, etc...]
wrdfile := [val1, val2, etc...]
Run Chrome
Open Site
For Key, Value in filenum ;iterate through Wordfiles
Loop
{
Send URL containing 'langid' var & 'filenum' var
Open DevTools and send jQuery and store totals
Confirm totals in MsgBox and save in txt file
}
Return
值得注意的是,所有语言都需要遍历相同的 6 个单词文件,因此也许文件数组也可以是第一个关联数组的一部分,而不是两个不同的数组...?不确定这里最好的方法是什么。
请帮我找到循环的正确结构和语法,如果可能的话,请为我指出正确的方向,就数组而言。 (我知道我没有正确关联它们)
我需要有关形成关联数组的帮助...我查阅的文档和示例不够详尽。请至少帮助推动正确的方向:oops:
我需要有关 For Key 命令的帮助。它应该通过它下面的循环,在每次迭代中提供下一个 'langid' 值,直到最后一个值 ("zh-Hant").
一旦第 2 点开始工作,我将调整脚本以循环遍历 6 个单词文件,然后重复语言。我的目的是循环遍历每种语言的 6 个单词文件。一旦它开始工作,我将添加一个小的 GUI 提示以允许通过整个循环或仅通过特定语言。
Link to AHK_Forum post containing full code.
再次感谢!
您可以为您的语言和文件变量使用关联数组。关联数组的正确语法如下。
object := { "key1" : "value", "key2" : "value 2" }
您可以像这样使用 for 循环遍历数组。
for key, value in object
MsgBox key: %key% value: %value%
for 循环已经遍历了您的对象,因此您不需要它下面的循环。如果我对你的理解正确,你可以尝试这样的事情。
; Associative arrays
Langs := { "bg" : "Bulgarian", "cs" : "Czech" }
Files := { "342553" : "OHFrontend", "342582" : "OHFrontendListing"}
; Open Chrome
For langId, langName in Langs
{
For fileId, fileName in Files
{
url := "example.com/" . langId . "/" . fileId
; Send url with langId & fileId
; Open DevTools and send jQuery and store totals
; Confirm totals in MsgBox and save in txt file
msgbox %url%
}
}
Return