关于 Power BI Desktop UI 自动化

这个方向是我三年前就有的想法,只要是在windows系统上的应用程序都可以实现UI自动化操作(模拟鼠标键盘),,,
那么从哪里开始呢?
没错!从python看自动化一般流程。
借助pywinauto库做UI自动化。
先看一个自动化操作txt的小例子:

from pywinauto.application import Application
app=Application().start('notepad.exe')
app.notepad.edit.TypeKeys('你好中国')
app.notepad.edit.TypeKeys('%FA')
或者
app['无标题-记事本'].MenuSelect('文件->另存为...')
app['另存为']['edit'].TypeKeys('吹牛逼.txt')
app['另存为']['保存'].click()

from pywinauto.application import Application
app=Application().start('notepad.exe')
app.notepad.edit.TypeKeys('你好中国')
app['无标题-记事本'].MenuSelect('文件->另存为...')
app['另存为']['edit'].TypeKeys('F:\吹牛逼.txt')
app['另存为']['保存'].click()
app['吹牛逼比.txt-记事本'].type_keys("%FX")

非常简单直白(人就是这样想的)
参考:
https://github.com/pywinauto/pywinauto/
https://www.kancloud.cn/gnefnuy/pywinauto_doc/1193035
https://pywinauto.readthedocs.io/en/latest/index.html
https://pywinauto-recorder.readthedocs.io/en/latest/
下面搞Power BI Desktop,,,
from pywinauto.application import Application
app=Application().connect(path="PBIDesktop.exe")
或者使用进程ID(PID)绑定process=
或者使用窗口句柄绑定handle=(窗口句柄可在Spy++中查看)
或使用窗口标题、类型匹配绑定(titile_re=
,class_name=
)。
定位窗口
spac=app.window(title='test - Power BI Desktop')
有快捷键的可用spac.type_keys('%字母1字母2...') +为shift,^为ctrl,%为alt
wpath定位
spac.children() //spac.children()[1] spac.children()[1].children()
相关引用参考:

'dict_keys(['Pane', '保存Pane', 'Pane0', 'Pane1', 'Pane2', '保存Pane0', '保存Pane1', '保存Pane2', 'Pane3', '保存Pane3', '保存Static', 'Static', 'Pane4', '保存Pane4', 'Pane5', '保存Pane5', 'Pane6', '保存Pane6', 'Pane7', '保存Pane7', '  保存  撤消最后一个操作。  重做上次撤消的操作。    test - Power BI Desktop PowerQuery@pqfans.com      最大化       文件 主页   帮助   外部工具       粘贴 向文档中添加剪切或复制的选定内容。  剪切 删除所选内容,以便可以将其粘贴到其他位置。  复制 复制所选内容,以便可以将其粘贴到其他位置。  剪贴板   连接到多个源中的数据。  获取数据    Excel 从 Microsoft Excel 工作簿导入数据。  Power BI\n数据集 创建到 Power BI 服务中数据集的实时连接。  SQL\nServer 从 SQL Server 数据库导入数据。  Enter\ndata 通过键入或粘贴新内容来创建新表。  最近使用的源   管理并连接到最近的数据源。  数据   使用 Power Query 编辑器来连接、准备和转换数据。  转换数据    刷新 通过刷新此报表中的所有视觉对象来获取最新数据。  查询   管理关系 添加、编辑或删除各表之间的关系。  关系   新建度量值 编写根据数据计算值的 DAX 表达式。  快度量值 从常用计算列表中选择,然后将结果添加到所选表中。  新建列 编写在所选表中创建新列并计算每行的值的 DAX 表达式。  新建表 编写 DAX 表达式以创建新表。  计算   管理角色 创建、更改或删除安全角色。  通过以下身份查看: 查看具有不同安全角色和权限的用户可看到的内容。  安全性   发布 在 Power BI 服务中在线发布此报表。  共享       切换功能区         \ue972 字段  \ue721 搜索    \ue70d   table   \ue712    \ue70d   查询   \ue712    \ue70d   表 (2)   \ue712                \ue8bb   \ue73e     有可用更新(单击下载)             ', 'Document', '  保存  撤消最后一个操作。  重做上次撤消的操作。    test - Power BI Desktop PowerQuery@pqfans.com      最大化       文件 主页   帮助   外部工具       粘贴 向文档中添加剪切或复制的选定内容。  剪切 删除所选内容,以便可以将其粘贴到其他位置。  复制 复制所选内容,以便可以将其粘贴到其他位置。  剪贴板   连接到多个源中的数据。  获取数据    Excel 从 Microsoft Excel 工作簿导入数据。  Power BI\n数据集 创建到 Power BI 服务中数据集的实时连接。  SQL\nServer 从 SQL Server 数据库导入数据。  Enter\ndata 通过键入或粘贴新内容来创建新表。  最近使用的源   管理并连接到最近的数据源。  数据   使用 Power Query 编辑器来连接、准备和转换数据。  转换数据    刷新 通过刷新此报表中的所有视觉对象来获取最新数据。  查询   管理关系 添加、编辑或删除各表之间的关系。  关系   新建度量值 编写根据数据计算值的 DAX 表达式。  快度量值 从常用计算列表中选择,然后将结果添加到所选表中。  新建列 编写在所选表中创建新列并计算每行的值的 DAX 表达式。  新建表 编写 DAX 表达式以创建新表。  计算   管理角色 创建、更改或删除安全角色。  通过以下身份查看: 查看具有不同安全角色和权限的用户可看到的内容。  安全性   发布 在 Power BI 服务中在线发布此报表。  共享       切换功能区         \ue972 字段  \ue721 搜索    \ue70d   table   \ue712    \ue70d   查询   \ue712    \ue70d   表 (2)   \ue712                \ue8bb   \ue73e     有可用更新(单击下载)             Document', 'Toolbar', 'test - Power BI DesktopToolbar', 'test - Power BI Desktop', 'Save', 'SaveButton', 'Button', '保存Static0', '保存Static1', '保存Static2', 'Static0', 'Static1', 'Static2', '保存', '撤消', 'Button0', 'Button1', 'Button2', '撤消Button', '撤消最后一个操作。', '撤消最后一个操作。Static', 'Static3', '重做Button', '重做', 'Button3', 'Static4', '重做上次撤消的操作。', '重做上次撤消的操作。Static', 'PowerQuery@pqfans.com', 'PowerQuery@pqfans.comButton', 'Button4', 'PowerQuery@pqfans.com0', 'PowerQuery@pqfans.com1', 'PowerQuery@pqfans.com2', 'PowerQuery@pqfans.comStatic', 'Static5', 'Image', 'PowerQuery@pqfans.comImage', 'Image0', 'Image1', 'Image2', 'PowerQuery@pqfans.comImage0', 'PowerQuery@pqfans.comImage1', 'PowerQuery@pqfans.comImage2', 'Image3', 'PowerQuery@pqfans.comImage3', 'MenuItem', '文件', '文件MenuItem', '文件0', '文件1', '文件2', '文件Static', 'Static6', '功能区选项卡TabControl', '功能区选项卡', 'TabControl', 'TabItem', '主页', '主页TabItem', '主页Static', '主页0', '主页1', '主页2', 'Static7', '帮助TabItem', 'TabItem0', 'TabItem1', 'TabItem2', '帮助', '帮助Static', '帮助0', '帮助1', '帮助2', 'Static8', '外部工具TabItem', 'TabItem3', '外部工具', '外部工具Static', '外部工具0', '外部工具1', '外部工具2', 'Static9', 'Custom', '外部工具Custom', '文件Custom', '粘贴', '粘贴Button', 'Button5', '向文档中添加剪切或复制的选定内容。Static', '向文档中添加剪切或复制的选定内容。', 'Static10', '剪切Button', '剪切', 'Button6', '剪切Static', '剪切0', '剪切1', '剪切2', 'Static11', '删除所选内容,以便可以将其粘贴到其他位置。', 'Static12', '删除所选内容,以便可以将其粘贴到其他位置。Static', '复制Button', '复制', 'Button7', 'Static13', '复制Static', '复制0', '复制1', '复制2', '复制所选内容,以便可以将其粘贴到其他位置。', '复制所选内容,以便可以将其粘贴到其他位置。Static', 'Static14', 'Static15', '剪贴板Static', '剪贴板', '获取数据', 'MenuItem0', 'MenuItem1', 'MenuItem2', '获取数据MenuItem', '获取数据0', '获取数据1', '获取数据2', '获取数据Button', 'Button8', '连接到多个源中的数据。Static', 'Static16', '连接到多个源中的数据。', '获取数据3', 'MenuItem3', '获取数据MenuItem0', '获取数据MenuItem1', '获取数据MenuItem2', 'ExcelButton', 'Excel', 'Button9', '从 Microsoft Excel 工作簿导入数据。', '从 Microsoft Excel 工作簿导入数据。Static', 'Static17', 'Power BI 数据集', 'Button10', 'Power BI 数据集Button', 'Power BIStatic', 'Power BI', 'Static18', '数据集Static', '数据集', 'Static19', '创建到 Power BI 服务中数据集的实时连接。Static', '创建到 Power BI 服务中数据集的实时连接。', 'Static20', 'Button11', 'SQL Server', 'SQL ServerButton', 'SQL', 'SQLStatic', 'Static21', 'Server', 'ServerStatic', 'Static22', 'Static23', '从 SQL Server 数据库导入数据。', '从 SQL Server 数据库导入数据。Static', 'Enter data', 'Enter dataButton', 'Button12', 'EnterStatic', 'Enter', 'Static24', 'Static25', 'dataStatic', 'data', '通过键入或粘贴新内容来创建新表。', '通过键入或粘贴新内容来创建新表。Static', 'Static26', 'MenuItem4', '最近使用的源', '最近使用的源MenuItem', 'Static27', '管理并连接到最近的数据源。Static', '管理并连接到最近的数据源。', 'Static28', '数据Static', '数据', 'MenuItem5', '转换数据', '转换数据MenuItem', '转换数据Button', '转换数据0', '转换数据1', '转换数据2', 'Button13', 'Static29', '使用 Power Query 编辑器来连接、准备和转换数据。Static', '使用 Power Query 编辑器来连接、准备和转换数据。', 'MenuItem6', '转换数据3', '转换数据MenuItem0', '转换数据MenuItem1', '转换数据MenuItem2', '刷新Button', '刷新', 'Button14', '通过刷新此报表中的所有视觉对象来获取最新数据。', '通过刷新此报表中的所有视觉对象来获取最新数据。Static', 'Static30', '查询', '查询Static', 'Static31', '管理关系Button', '管理关系', 'Button15', '添加、编辑或删除各表之间的关系。', '添加、编辑或删除各表之间的关系。Static', 'Static32', '关系', '关系Static', 'Static33', '新建度量值', '新建度量值Button', 'Button16', '编写根据数据计算值的 DAX 表达式。', '编写根据数据计算值的 DAX 表达式。Static', 'Static34', '快度量值', 'Button17', '快度量值Button', '从常用计算列表中选择,然后将结果添加到所选表中。', '从常用计算列表中选择,然后将结果添加到所选表中。Static', 'Static35', '新建列', '新建列Button', 'Button18', '编写在所选表中创建新列并计算每行的值的 DAX 表达式。Static', '编写在所选表中创建新列并计算每行的值的 DAX 表达式。', 'Static36', '新建表Button', 'Button19', '新建表', 'Static37', '编写 DAX 表达式以创建新表。Static', '编写 DAX 表达式以创建新表。', '计算', '计算Static', 'Static38', '管理角色Button', '管理角色', 'Button20', '创建、更改或删除安全角色。Static', '创建、更改或删除安全角色。', 'Static39', '通过以下身份查看:Button', 'Button21', '通过以下身份查看:', '查看具有不同安全角色和权限的用户可看到的内容。Static', '查看具有不同安全角色和权限的用户可看到的内容。', 'Static40', 'Static41', '安全性Static', '安全性', '发布', '发布Button', 'Button22', '在 Power BI 服务中在线发布此报表。Static', '在 Power BI 服务中在线发布此报表。', 'Static42', '共享Static', '共享', 'Static43', '切换功能区', '切换功能区Button', 'Button23', '报表Button', '报表', 'Button24', '向文档中添加剪切或复制的选定内容。Image', 'Image4', '数据Button', 'Button25', '数据0', '数据1', '数据2', '向文档中添加剪切或复制的选定内容。Image0', '向文档中添加剪切或复制的选定内容。Image1', '向文档中添加剪切或复制的选定内容。Image2', 'Image5', '模型', '模型Button', 'Button26', '向文档中添加剪切或复制的选定内容。Image3', 'Image6', 'Document0', 'Document1', 'Document2', 'PowerQuery@pqfans.comDocument', '字段Button', '字段', 'Button27', '\ue972', '\ue972Static', 'Static44', 'Dialog', '\ue972Dialog', '\ue721Dialog', 'Static45', '\ue721Static', '\ue721', 'GroupBox', '搜索GroupBox', '搜索', 'Separator', '\ue721Separator', '\ue70dTreeView', 'TreeView', '\ue70dListItem', 'ListItem', 'table 表', 'table 表TreeItem', 'TreeItem', '\ue70d', '\ue70dStatic', 'Static46', 'Image7', '\ue70dImage', 'table', 'tableStatic', 'Static47', '更多选项Button', '更多选项', 'Button28', '\ue70dListItem0', '\ue70dListItem1', '\ue70dListItem2', 'ListItem0', 'ListItem1', 'ListItem2', '查询 表', 'TreeItem0', 'TreeItem1', 'TreeItem2', '查询 表TreeItem', '\ue70d0', '\ue70d1', '\ue70d2', '\ue70dStatic0', '\ue70dStatic1', '\ue70dStatic2', 'Static48', 'Image8', '\ue70dImage0', '\ue70dImage1', '\ue70dImage2', '查询0', '查询1', '查询2', '查询Static0', '查询Static1', '查询Static2', 'Static49', '更多选项Button0', '更多选项Button1', '更多选项Button2', '更多选项0', '更多选项1', '更多选项2', 'Button29', '\ue70dListItem3', 'ListItem3', 'TreeItem3', '表 (2) 表TreeItem', '表 (2) 表', '\ue70d3', '\ue70dStatic3', 'Static50', 'Image9', '\ue70dImage3', 'Static51', '表 (2)Static', '表 (2)', '更多选项Button3', '更多选项3', 'Button30', 'Cancel_ButtonTextButton', 'Cancel_ButtonText', 'Button31', '\ue8bbStatic', '\ue8bb', 'Static52', 'Commit_ButtonText', 'Commit_ButtonTextButton', 'Button32', '\ue73e', '\ue73eStatic', 'Static53', '有可用更新(单击下载)Static', '有可用更新(单击下载)', 'Static54', 'Pane8', '保存Pane8', 'Pane9', '保存Pane9', 'Pane10', '保存Pane10', 'Pane11', '保存Pane11', '  保存  撤消最后一个操作。  重做上次撤消的操作。    test - Power BI Desktop PowerQuery@pqfans.com      最大化       文件 主页   帮助   外部工具       粘贴 向文档中添加剪切或复制的选定内容。   剪切 删除所选内容,以便可以将其粘贴到其他位置。   复制 复制所选内容,以便可以将其粘贴到其他位置。   剪贴板   连接到多个源中的数据。  获取数据     Excel 从 Microsoft Excel 工作簿导入数据。   Power BI\n数据集 创建到 Power BI 服务中数据集的实时连接。   SQL\nServer 从 SQL Server 数据库导入数据。   Enter\ndata 通过键入或粘贴新内容来创建新表。   最近使用的源   管理并连接到最近的数据源。  数据   使用 Power Query 编辑器来连接、准备和转换数据。  转换数据     刷新 通过刷新此报表中的所有视觉对象来获取最新数据。   查询   管理关系 添加、编辑或删除各表之间的关系。   关系   管理角色 创建、更改或删除安全角色。   通过以下身份查看: 查看具有不同安全角色和权限的用户可看到的内容。   安全性   问答设置 教导 Q&A 以更好地理解用户、审阅用户问过的问题和管理你已添加的术语。   语言   更改在问答中提问所使用的语言。  语言架构   导入或导出文件,其中包含问答用于了解数据集的重要信息以及已训练问答理解的自定义术语。  问答   发布 在 Power BI 服务中在线发布此报表。   共享       切换功能区         有可用更新(单击下载) - 100%     + 重置布局 适应屏幕               Document', 'Document3', '  保存  撤消最后一个操作。  重做上次撤消的操作。    test - Power BI Desktop PowerQuery@pqfans.com      最大化       文件 主页   帮助   外部工具       粘贴 向文档中添加剪切或复制的选定内容。   剪切 删除所选内容,以便可以将其粘贴到其他位置。   复制 复制所选内容,以便可以将其粘贴到其他位置。   剪贴板   连接到多个源中的数据。  获取数据     Excel 从 Microsoft Excel 工作簿导入数据。   Power BI\n数据集 创建到 Power BI 服务中数据集的实时连接。   SQL\nServer 从 SQL Server 数据库导入数据。   Enter\ndata 通过键入或粘贴新内容来创建新表。   最近使用的源   管理并连接到最近的数据源。  数据   使用 Power Query 编辑器来连接、准备和转换数据。  转换数据     刷新 通过刷新此报表中的所有视觉对象来获取最新数据。   查询   管理关系 添加、编辑或删除各表之间的关系。   关系   管理角色 创建、更改或删除安全角色。   通过以下身份查看: 查看具有不同安全角色和权限的用户可看到的内容。   安全性   问答设置 教导 Q&A 以更好地理解用户、审阅用户问过的问题和管理你已添加的术语。   语言   更改在问答中提问所使用的语言。  语言架构   导入或导出文件,其中包含问答用于了解数据集的重要信息以及已训练问答理解的自定义术语。  问答   发布 在 Power BI 服务中在线发布此报表。   共享       切换功能区         有可用更新(单击下载) - 100%     + 重置布局 适应屏幕               ', 'Toolbar0', 'Toolbar1', 'Toolbar2', 'test - Power BI DesktopToolbar0', 'test - Power BI DesktopToolbar1', 'test - Power BI DesktopToolbar2', 'test - Power BI Desktop0', 'test - Power BI Desktop1', 'test - Power BI Desktop2', 'Save0', 'Save1', 'Save2', 'SaveButton0', 'SaveButton1', 'SaveButton2', 'Button33', '保存Static3', 'Static55', '保存0', '保存1', '保存2', '撤消0', '撤消1', '撤消2', 'Button34', '撤消Button0', '撤消Button1', '撤消Button2', '撤消最后一个操作。0', '撤消最后一个操作。1', '撤消最后一个操作。2', '撤消最后一个操作。Static0', '撤消最后一个操作。Static1', '撤消最后一个操作。Static2', 'Static56', '重做Button0', '重做Button1', '重做Button2', '重做0', '重做1', '重做2', 'Button35', 'Static57', '重做上次撤消的操作。0', '重做上次撤消的操作。1', '重做上次撤消的操作。2', '重做上次撤消的操作。Static0', '重做上次撤消的操作。Static1', '重做上次撤消的操作。Static2', 'PowerQuery@pqfans.com3', 'PowerQuery@pqfans.comButton0', 'PowerQuery@pqfans.comButton1', 'PowerQuery@pqfans.comButton2', 'Button36', 'PowerQuery@pqfans.com4', 'PowerQuery@pqfans.comStatic0', 'PowerQuery@pqfans.comStatic1', 'PowerQuery@pqfans.comStatic2', 'Static58', 'Image10', 'PowerQuery@pqfans.comImage4', 'Image11', 'PowerQuery@pqfans.comImage5', 'Image12', 'PowerQuery@pqfans.comImage6', 'MenuItem7', '文件3', '文件MenuItem0', '文件MenuItem1', '文件MenuItem2', '文件4', '文件Static0', '文件Static1', '文件Static2', 'Static59', '功能区选项卡TabControl0', '功能区选项卡TabControl1', '功能区选项卡TabControl2', '功能区选项卡0', '功能区选项卡1', '功能区选项卡2', 'TabControl0', 'TabControl1', 'TabControl2', 'TabItem4', '主页3', '主页TabItem0', '主页TabItem1', '主页TabItem2', '主页Static0', '主页Static1', '主页Static2', '主页4', 'Static60', '帮助TabItem0', '帮助TabItem1', '帮助TabItem2', 'TabItem5', '帮助3', '帮助Static0', '帮助Static1', '帮助Static2', '帮助4', 'Static61', '外部工具TabItem0', '外部工具TabItem1', '外部工具TabItem2', 'TabItem6', '外部工具3', '外部工具Static0', '外部工具Static1', '外部工具Static2', '外部工具4', 'Static62', 'Custom0', 'Custom1', 'Custom2', '外部工具Custom0', '外部工具Custom1', '外部工具Custom2', '文件Custom0', '文件Custom1', '文件Custom2', '粘贴0', '粘贴1', '粘贴2', '粘贴Button0', '粘贴Button1', '粘贴Button2', 'Button37', '向文档中添加剪切或复制的选定内容。Static0', '向文档中添加剪切或复制的选定内容。Static1', '向文档中添加剪切或复制的选定内容。Static2', '向文档中添加剪切或复制的选定内容。0', '向文档中添加剪切或复制的选定内容。1', '向文档中添加剪切或复制的选定内容。2', 'Static63', '剪切Button0', '剪切Button1', '剪切Button2', '剪切3', 'Button38', '剪切Static0', '剪切Static1', '剪切Static2', '剪切4', 'Static64', '删除所选内容,以便可以将其粘贴到其他位置。0', '删除所选内容,以便可以将其粘贴到其他位置。1', '删除所选内容,以便可以将其粘贴到其他位置。2', 'Static65', '删除所选内容,以便可以将其粘贴到其他位置。Static0', '删除所选内容,以便可以将其粘贴到其他位置。Static1', '删除所选内容,以便可以将其粘贴到其他位置。Static2', '复制Button0', '复制Button1', '复制Button2', '复制3', 'Button39', 'Static66', '复制Static0', '复制Static1', '复制Static2', '复制4', '复制所选内容,以便可以将其粘贴到其他位置。0', '复制所选内容,以便可以将其粘贴到其他位置。1', '复制所选内容,以便可以将其粘贴到其他位置。2', '复制所选内容,以便可以将其粘贴到其他位置。Static0', '复制所选内容,以便可以将其粘贴到其他位置。Static1', '复制所选内容,以便可以将其粘贴到其他位置。Static2', 'Static67', 'Static68', '剪贴板Static0', '剪贴板Static1', '剪贴板Static2', '剪贴板0', '剪贴板1', '剪贴板2', '获取数据4', 'MenuItem8', '获取数据MenuItem3', '获取数据5', '获取数据Button0', '获取数据Button1', '获取数据Button2', 'Button40', '连接到多个源中的数据。Static0', '连接到多个源中的数据。Static1', '连接到多个源中的数据。Static2', 'Static69', '连接到多个源中的数据。0', '连接到多个源中的数据。1', '连接到多个源中的数据。2', '获取数据6', 'MenuItem9', '获取数据MenuItem4', 'ExcelButton0', 'ExcelButton1', 'ExcelButton2', 'Excel0', 'Excel1', 'Excel2', 'Button41', '从 Microsoft Excel 工作簿导入数据。0', '从 Microsoft Excel 工作簿导入数据。1', '从 Microsoft Excel 工作簿导入数据。2', '从 Microsoft Excel 工作簿导入数据。Static0', '从 Microsoft Excel 工作簿导入数据。Static1', '从 Microsoft Excel 工作簿导入数据。Static2', 'Static70', 'Power BI 数据集0', 'Power BI 数据集1', 'Power BI 数据集2', 'Button42', 'Power BI 数据集Button0', 'Power BI 数据集Button1', 'Power BI 数据集Button2', 'Power BIStatic0', 'Power BIStatic1', 'Power BIStatic2', 'Power BI0', 'Power BI1', 'Power BI2', 'Static71', '数据集Static0', '数据集Static1', '数据集Static2', '数据集0', '数据集1', '数据集2', 'Static72', '创建到 Power BI 服务中数据集的实时连接。Static0', '创建到 Power BI 服务中数据集的实时连接。Static1', '创建到 Power BI 服务中数据集的实时连接。Static2', '创建到 Power BI 服务中数据集的实时连接。0', '创建到 Power BI 服务中数据集的实时连接。1', '创建到 Power BI 服务中数据集的实时连接。2', 'Static73', 'Button43', 'SQL Server0', 'SQL Server1', 'SQL Server2', 'SQL ServerButton0', 'SQL ServerButton1', 'SQL ServerButton2', 'SQL0', 'SQL1', 'SQL2', 'SQLStatic0', 'SQLStatic1', 'SQLStatic2', 'Static74', 'Server0', 'Server1', 'Server2', 'ServerStatic0', 'ServerStatic1', 'ServerStatic2', 'Static75', 'Static76', '从 SQL Server 数据库导入数据。0', '从 SQL Server 数据库导入数据。1', '从 SQL Server 数据库导入数据。2', '从 SQL Server 数据库导入数据。Static0', '从 SQL Server 数据库导入数据。Static1', '从 SQL Server 数据库导入数据。Static2', 'Enter data0', 'Enter data1', 'Enter data2', 'Enter dataButton0', 'Enter dataButton1', 'Enter dataButton2', 'Button44', 'EnterStatic0', 'EnterStatic1', 'EnterStatic2', 'Enter0', 'Enter1', 'Enter2', 'Static77', 'Static78', 'dataStatic0', 'dataStatic1', 'dataStatic2', 'data0', 'data1', 'data2', '通过键入或粘贴新内容来创建新表。0', '通过键入或粘贴新内容来创建新表。1', '通过键入或粘贴新内容来创建新表。2', '通过键入或粘贴新内容来创建新表。Static0', '通过键入或粘贴新内容来创建新表。Static1', '通过键入或粘贴新内容来创建新表。Static2', 'Static79', 'MenuItem10', '最近使用的源0', '最近使用的源1', '最近使用的源2', '最近使用的源MenuItem0', '最近使用的源MenuItem1', '最近使用的源MenuItem2', 'Static80', '管理并连接到最近的数据源。Static0', '管理并连接到最近的数据源。Static1', '管理并连接到最近的数据源。Static2', '管理并连接到最近的数据源。0', '管理并连接到最近的数据源。1', '管理并连接到最近的数据源。2', 'Static81', '数据Static0', '数据Static1', '数据Static2', '数据3', 'MenuItem11', '转换数据4', '转换数据MenuItem3', '转换数据Button0', '转换数据Button1', '转换数据Button2', '转换数据5', 'Button45', 'Static82', '使用 Power Query 编辑器来连接、准备和转换数据。Static0', '使用 Power Query 编辑器来连接、准备和转换数据。Static1', '使用 Power Query 编辑器来连接、准备和转换数据。Static2', '使用 Power Query 编辑器来连接、准备和转换数据。0', '使用 Power Query 编辑器来连接、准备和转换数据。1', '使用 Power Query 编辑器来连接、准备和转换数据。2', 'MenuItem12', '转换数据6', '转换数据MenuItem4', '刷新Button0', '刷新Button1', '刷新Button2', '刷新0', '刷新1', '刷新2', 'Button46', '通过刷新此报表中的所有视觉对象来获取最新数据。0', '通过刷新此报表中的所有视觉对象来获取最新数据。1', '通过刷新此报表中的所有视觉对象来获取最新数据。2', '通过刷新此报表中的所有视觉对象来获取最新数据。Static0', '通过刷新此报表中的所有视觉对象来获取最新数据。Static1', '通过刷新此报表中的所有视觉对象来获取最新数据。Static2', 'Static83', '查询3', '查询Static3', 'Static84', '管理关系Button0', '管理关系Button1', '管理关系Button2', '管理关系0', '管理关系1', '管理关系2', 'Button47', '添加、编辑或删除各表之间的关系。0', '添加、编辑或删除各表之间的关系。1', '添加、编辑或删除各表之间的关系。2', '添加、编辑或删除各表之间的关系。Static0', '添加、编辑或删除各表之间的关系。Static1', '添加、编辑或删除各表之间的关系。Static2', 'Static85', '关系0', '关系1', '关系2', '关系Static0', '关系Static1', '关系Static2', 'Static86', '管理角色Button0', '管理角色Button1', '管理角色Button2', '管理角色0', '管理角色1', '管理角色2', 'Button48', '创建、更改或删除安全角色。Static0', '创建、更改或删除安全角色。Static1', '创建、更改或删除安全角色。Static2', '创建、更改或删除安全角色。0', '创建、更改或删除安全角色。1', '创建、更改或删除安全角色。2', 'Static87', '通过以下身份查看:Button0', '通过以下身份查看:Button1', '通过以下身份查看:Button2', 'Button49', '通过以下身份查看:0', '通过以下身份查看:1', '通过以下身份查看:2', '查看具有不同安全角色和权限的用户可看到的内容。Static0', '查看具有不同安全角色和权限的用户可看到的内容。Static1', '查看具有不同安全角色和权限的用户可看到的内容。Static2', '查看具有不同安全角色和权限的用户可看到的内容。0', '查看具有不同安全角色和权限的用户可看到的内容。1', '查看具有不同安全角色和权限的用户可看到的内容。2', 'Static88', 'Static89', '安全性Static0', '安全性Static1', '安全性Static2', '安全性0', '安全性1', '安全性2', '问答设置', '问答设置Button', 'Button50', 'Static90', '教导 Q&A 以更好地理解用户、审阅用户问过的问题和管理你已添加的术语。', '教导 Q&A 以更好地理解用户、审阅用户问过的问题和管理你已添加的术语。Static', 'MenuItem13', '语言MenuItem', '语言', '更改在问答中提问所使用的语言。', '更改在问答中提问所使用的语言。Static', 'Static91', 'MenuItem14', '语言架构MenuItem', '语言架构', '导入或导出文件,其中包含问答用于了解数据集的重要信息以及已训练问答理解的自定义术语。Static', '导入或导出文件,其中包含问答用于了解数据集的重要信息以及已训练问答理解的自定义术语。', 'Static92', '问答', '问答Static', 'Static93', '发布0', '发布1', '发布2', '发布Button0', '发布Button1', '发布Button2', 'Button51', '在 Power BI 服务中在线发布此报表。Static0', '在 Power BI 服务中在线发布此报表。Static1', '在 Power BI 服务中在线发布此报表。Static2', '在 Power BI 服务中在线发布此报表。0', '在 Power BI 服务中在线发布此报表。1', '在 Power BI 服务中在线发布此报表。2', 'Static94', '共享Static0', '共享Static1', '共享Static2', '共享0', '共享1', '共享2', 'Static95', '切换功能区0', '切换功能区1', '切换功能区2', '切换功能区Button0', '切换功能区Button1', '切换功能区Button2', 'Button52', '报表Button0', '报表Button1', '报表Button2', '报表0', '报表1', '报表2', 'Button53', '向文档中添加剪切或复制的选定内容。Image4', 'Image13', '数据Button0', '数据Button1', '数据Button2', 'Button54', '数据4', '向文档中添加剪切或复制的选定内容。Image5', 'Image14', '模型0', '模型1', '模型2', '模型Button0', '模型Button1', '模型Button2', 'Button55', '向文档中添加剪切或复制的选定内容。Image6', 'Image15', '有可用更新(单击下载)Static0', '有可用更新(单击下载)Static1', '有可用更新(单击下载)Static2', '有可用更新(单击下载)0', '有可用更新(单击下载)1', '有可用更新(单击下载)2', 'Static96', '-', '-Static', 'Static97', 'GroupBox0', 'GroupBox1', 'GroupBox2', '100%', '100%GroupBox', '+', '+Static', 'Static98', 'Menu', 'Menu0', 'Menu1', 'Menu2', 'Menu3', 'Menu4', 'Pane12', '保存Pane12'])

刷新:

from pywinauto import Desktop,Application,keyboard
app=Application(backend='uia').connect(path='PBIDesktop.exe')
spac=app.window(title_re='.*Power BI Desktop')
spac.set_focus()
spac.主页.wait("visible")
spac.主页.click_input()
spac.刷新.wait("visible")
spac.刷新.click_input()
spac.Cancel.wait_not("visible",timeout=6000)
keyboard.send_keys("^s")
app.kill()

打印菜单相关引用信息:

from pywinauto import Desktop,Application,keyboard
app=Application(backend='uia').connect(path='PBIDesktop.exe')
spac=app["test - Power BI Desktop"]
spac.print_control_identifiers()

file
file
file
那么通过返回的信息我们可以使用

spac.child_window(title="Enter data", auto_id="enterData", control_type="Button").click()

直接打开下图中PQ输入数据界面:
file
file
打开pq空白查询界面:

spac.获取数据.click_input()
spac.空白查询.click_input()

PQ编辑界面操作:

pq=app.window(title_re='.*Power Query 编辑器')
pq.set_focus()
pq.print_control_identifiers()

file

pq.child_window(title="查询4", control_type="Text").right_click_input()

高级编辑器:

pq.高级编辑器.click_input()

另一个库就是pyautogui
参考:https://pyautogui.readthedocs.io/en/latest/

**鼠标控制**
import pyautogui
# 获取当前屏幕分辨率   x1,y1= pyautogui.size()
# 获取当前鼠标位置   x,y= pyautogui.position()
# 鼠标1秒移动到绝对位置100,100   pyautogui.moveTo(100, 100,1)
pyautogui.moveTo(x=100, y=100,duration=1, tween=pyautogui.linear)
#  用缓动/渐变函数让鼠标2秒后移动到(500,500)位置
pyautogui.moveTo(x=500, y=500, duration=2, tween=pyautogui.easeInOutQuad)
#鼠标移到屏幕中央pyautogui.moveTo(x1 / 2, y1 / 2)
# 鼠标左击一次pyautogui.click()
# clicks 点击次数; interval点击之间的间隔;button 'left', 'middle', 'right' 对应鼠标 左 中 右或者取值(1, 2, or 3) ;tween 渐变函数。pyautogui.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
# 鼠标相对移动 ,向下移动pyautogui.moveRel(None, 10)
pyautogui.moveRel(xOffset=None, yOffset=10,duration=0.0, tween=pyautogui.linear)
# 鼠标当前位置0间隔双击pyautogui.doubleClick()
pyautogui.doubleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
# 鼠标当前位置3击pyautogui.tripleClick()
pyautogui.tripleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
#右击pyautogui.rightClick()
#中击pyautogui.middleClick()
#鼠标拖拽pyautogui.dragTo(x=400, y=500, duration=3,button='left')
#鼠标相对拖拽pyautogui.dragRel(xOffset=100,yOffset=100,duration=,button='left',mouseDownUp=False)
#鼠标移动到x=1200, y=800位置按下pyautogui.mouseDown(x=1200, y=800, button='left')
#鼠标移动到x=2000, y=600位置松开(与mouseDown组合使用选中)pyautogui.mouseUp(x=2000,, y=600, button='left',duration=5)
#鼠标当前位置滚轮滚动pyautogui.scroll()
#鼠标水平滚动(Linux)pyautogui.hscroll()
#鼠标左右滚动(Linux)pyautogui.vscroll()

**模拟键盘**
pyautogui.typewrite('Hello world!') # 输入Hello world!字符串
pyautogui.typewrite('Hello world!', interval=0.25) # 每次输入间隔0.25秒,输入Hello world! 
pyautogui.press('enter') # 按下并松开(轻敲)回车键
pyautogui.press(['left', 'left', 'left', 'left']) # 按下并松开(轻敲)四下左方向键
pyautogui.keyDown('shift') # 按下`shift`键
pyautogui.keyUp('shift') # 松开`shift`键 
pyautogui.keyDown('shift')
pyautogui.press('4')
pyautogui.keyUp('shift') # 输出 $ 符号的按键 
pyautogui.hotkey('ctrl', 'v') # 组合按键(Ctrl+V),粘贴功能,按下并松开'ctrl'和'v'按键 
pyautogui.KEYBOARD_KEYS = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.',
              '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@',
              '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
              'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
              'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback',
              'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch',
              'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal',
              'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
              'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22',
              'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul',
              'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2',
              'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
              'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9',
              'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print',
              'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select',
              'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
              'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command',
              'option', 'optionleft', 'optionright']
**安全设置**
#保护措施,避免失控  pyautogui.FAILSAFE = True
#为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。pyautogui.PAUSE = 0.5

**屏幕图像匹配**
#截屏
im= pyautogui.screenshot()
im.save('test.png')
直接im= pyautogui.screenshot('test.png')
# 截取区域图片,region参数为:左上角XY坐标值、宽度和高度
pyautogui.screenshot(r'F:\test.png', region=(0, 0, 300, 400))
#在当前屏幕中查找指定图片 a = pyautogui.locateOnScreen('F:/test.png')
#获取定位到的图中间点坐标 x,y=pyautogui.center(a)
#右击该坐标点pyautogui.rightClick(x,y)
# 获取坐标(200,100)所在屏幕点的RGB颜色
pix = pyautogui.screenshot().getpixel((200, 100)) 
positionStr = ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr) 
或者pix = pyautogui.pixel(200, 100) 
positionStr = ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr)
# 检验指定位置的像素值,可以用pixelMatchesColor(x,y,RGB)函数。
# tolerance参数可以指定红、绿、蓝3种颜色误差范围
pyautogui.pixelMatchesColor(100, 200, (255, 255, 245), tolerance=8)
# 获得文件图片在现在的屏幕上面的坐标,返回的是一个元组(top, left, width, height)
# 如果截图没找到,pyautogui.locateOnScreen()函数返回None
a = pyautogui.locateOnScreen(r'F:\test.png')
print(a) 
#获取图片在屏幕中的中心点位置
x, y = pyautogui.center(a) 
print(x, y)
可以直接用 x, y = pyautogui.locateCenterOnScreen(r'F:\test.png') 
# 匹配屏幕上所有的满足位置
a = list(pyautogui.locateAllOnScreen(r'F:\test.png'))
print(a)

**其他辅助操作**
#提示信息 pyautogui.alert(text='This is an alert box.', title='Test')
#提示按钮 pyautogui.confirm('Enter option.', buttons=['A', 'B', 'C'])

#密码框 
a = pyautogui.password('Enter password (text will be hidden)')
print(a)

#普通文本输入框
a = pyautogui.prompt('test')
print(a)

pyautogui.alert(text='', title='', button='OK')
b = pyautogui.alert(text='测试', title='请求信息', button='OK')
print(b) 
# 显示一个简单的带文字、OK和Cancel按钮的消息弹窗,用户点击后返回被点击button的文字,支持自定义数字、文字的列表。
pyautogui.confirm(text='', title='', buttons=['OK', 'Cancel']) 
# 4个按键0-3的消息弹窗 pyautogui.confirm(text='', title='', buttons=range(4)) 
a = pyautogui.confirm(text='', title='', buttons=range(4))
print(a) 
# 可以输入的消息弹窗,带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.prompt(text='', title='', default='')
# 样式同prompt(),用于输入密码,消息用*表示。带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.password(text='', title='', default='', mask='*')

file
file
上面多次调用图片搜索匹配位置的几个步骤可以封装为函数简化调用过程,如果知道大体区域可以指定具体范围减小搜索量为程序提速。
就算你装了cv2下面的方式匹配屏幕图片位置并获取图片中心点位置也不一定成功:
pyautogui.locateCenterOnScreen(图片地址,grayscale=False,confidence=0.9)
如果你自己用来模拟类似按键精灵,你的分辨率固定,窗口打开布局都已经熟悉的情况下直接模拟一次,写死鼠标点击位置即可(不用图片搜索浪费时间),,,
我感觉他们都是用了微软uiautomation.dll底层封装,还有win32系统相关API.
群友推荐了另一款貌似强大的工具:
https://www.autohotkey.com/docs/AutoHotkey.htm
https://wyagd001.github.io/zh-cn/docs/AutoHotkey.htm
file
file
取到指定目标位置x,y值后直接写下

Click x值, y值 ; 在指定坐标处点击鼠标左键

另外有双击、三连击、右击、移动不击、滚轮、按下拖拽等操作看官方文档,
窗口的隐藏:

WinHide,test - Power BI Desktop

我测试时发现会把整个程序给关闭,用WinShow,test - Power BI Desktop命令找不回原来的窗口,,,
对于有些弹窗可以使用WinKill强行关闭:

IfWinExist, 窗口title
    WinKill ; 
else
    ........

激活窗口

WinActivate,test - Power BI Desktop

属性相关获取

WinWait,test - Power BI Desktop
WinActivate 
WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".
WinGetClass, class, A
MsgBox, The active window's class is "%class%".
WinGetText, text 
MsgBox, The text is:`n%text%
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%A_Index% is "%A_LoopField%". Continue?
    IfMsgBox, No
        break
}

窗口列表

WinGet,x,ControlList,test - Power BI Desktop
MsgBox %x%

窗口最大化最小化

WinWait,test - Power BI Desktop
WinMaximize
WinMinimize

指定区域搜索图像坐标:

ImageSearch, x变量, y变量, 矩形区域左上x,矩形区域左上y, 矩形区域右下x,矩形区域右下y,图片地址

类似可以展开颜色搜索:
PixelSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ColorID , Variation, Mode
播放视频:SoundPlay, 文件地址
调节音量:SoundSetWaveVolume, +20
正则查找匹配替换:MsgBox % RegExMatch("abc123123", "123$")
RegExReplace("abc123123", "123$", "xyz")
字符串拆分:将一个句子拆分成单词数组, 并报告第四个单词.
TestString := "This is a test."
word_array := StrSplit(TestString, A_Space, ".") ; 忽略句点.
MsgBox % "The 4th word is " word_array[4]

colors := "red,green,blue"
for index, color in StrSplit(colors, ",")
MsgBox % "Color number " index " is " color
注册表操作:
RegWrite, REG_SZ, HKEY_LOCAL_MACHINE\SOFTWARE\TestKey, MyValueName, Test Value
RegDelete, HKEY_LOCAL_MACHINE\Software\SomeApplication, TestValue
RegRead, OutputVar, HKEY_LOCAL_MACHINE\Software\SomeApplication, TestValue
进程操作:
Process, Wait, notepad.exe, 5.5
进程还包括以下操作
Exist: 检查指定的进程是否存在.
Close: 强制关闭第一个匹配进程.
List: 还没有实现.
Priority: 更改首个匹配进程的优先级..
WaitClose: 等待所有匹配进程关闭.
Run命令:
打开回收站
Run, ::{645ff040-5081-101b-9f08-00aa002f954e}
打开我的电脑
Run, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}
发邮件
Run, mailto:547925332@qq.com?subject=This is the subject line&body=This is the message body's text.
打开浏览网址
Run, https://www.google.com
文件打开读写:
file := FileOpen(FileName, "w")
TestString := "This is a test string.rn"
file.Write(TestString)
FileRead, OutputVar, C:\My Documents\My File.txt
调用dll文件:
Result := DllCall("DllFile\Function" , Type1, Arg1, Type2, Arg2, "Cdecl ReturnType")
部分菜单定位可用tab键定位:
send,{tab}

loop循环

Loop, 10
{
Send, {Enter}
}

无限循环
Loop
{
Send, {Enter}
Sleep, 1000
}

while循环

count := 0

while (count < 10)
{
Send, {Enter}
Sleep, 1000
count++
}

写文件
FileAppend, , Filename, UTF-8-RAW
读文件
FileRead, OutputVar, Filename
FileReadLine, OutputVar, Filename, LineNum
Loop, Read, InputFile [, OutputFile]

Loop, Read, C:\Docs\Address List.txt, C:\Docs\Family Addresses.txt
{
IfInString, A_LoopReadLine, family, FileAppend, %A_LoopReadLine%`n
}

打开文件
File := FileOpen(Filename, Flags [, Encoding])
写入
; 写入内容
File.Write(String)
; 按行写入内容
File.WriteLine([String])
; 写入特定类型数据
File.WriteNumType(Num)
; 写入原始格式数据
File.RawWrite(VarOrAddress, Bytes)

读取
; 读取内容
String := File.Read([Characters])
; 读取一行内容
Line := File.ReadLine()
; 读取特定类型数据
Num := File.ReadNumType()
; 读取原始格式数据
File.RawRead(VarOrAddress, Bytes)

; 移动文件指针
File.Seek(Distance [, Origin = 0])
File.Position := Distance
File.Pos := Distance

; 获取文件指针的当前位置
Pos := File.Tell()
Pos := File.Position
Pos := File.Pos

; 获取和设置文件的大小
FileSize := File.Length
File.Length := NewSize

; 判断文件指针是否到达文件末尾
IsAtEOF := File.AtEOF

; 关闭文件
File.Close()

; 获取或设置文件编码
Encoding := File.Encoding
File.Encoding := Encoding

; 获取文件句柄
File.__Handle

字符串拼接直接用空格,不管是字符串、整数还是浮点数,都可以用空格拼接成一个字符串,空格可以和其他算术运算符一起使用。

遍历字符串
Loop, Parse, InputVar [, Delimiters, OmitChars]
text := "abcd"

Loop, Parse, text
{
MsgBox, %A_LoopField%
}

text =
(
line1
line2
line3
)

Loop, Parse, text, n,r
{
MsgBox, %A_LoopField%
}

网络下载
UrlDownloadToFile, http://****/test.png, C:\test.png

POST
UrlDownloadToVar(url, headers = "")
{
static whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("POST", url, true)

if (headers != "")
{
    for key, value in headers
    {
        whr.SetRequestHeader(key, value)
    }
}

whr.Send()
whr.WaitForResponse()
return whr.ResponseText

}

result := UrlDownloadToVar("http://test.com"
, { "key1" : "value1", "key2" : "value2" })

Run命令
Run, Target [, WorkingDir, Max|Min|Hide|UseErrorLevel, OutputVarPID]
Run, properties C:\test.txt
; 打开我的文档文件夹
Run, ::{450d8fba-ad25-11d0-98a8-0800361b1103}
常用 CLSID 文件夹列表:
CLSID 名称
::{20d04fe0-3aea-1069-a2d8-08002b30309d} 我的电脑
::{450d8fba-ad25-11d0-98a8-0800361b1103} 我的文档
::{645ff040-5081-101b-9f08-00aa002f954e} 回收站
::{208d2c60-3aea-1069-a2d7-08002b30309d} 网上邻居
::{7007acc7-3202-11d1-aad2-00805fc1270e} 网络连接
::{2227a280-3aea-1069-a2de-08002b30309d} 打印机和传真

Run,C:\Users\Administrator\Desktop\test.pbix,,Max;最大化窗口界面打开指定pbix文件
WinWait,test - Power BI Desktop;等待指定窗口出现再往下运行
Sleep,10000;预留PBIDesktop数据加载窗口准备时间
Click,160,140;点击下拉菜单
Sleep,2000;等下拉菜单弹出留一些缓冲时间
Send,{tab 9}{enter};利用tab键定位子菜单的空查询

剩下键盘操作字符问题,,,

Run,C:\Users\Admin\Desktop\test.pbix,,Max
WinWait,test - Power BI Desktop
Sleep,3000
Click,160,140
Sleep,1000
Send,{tab 9}{enter}
Sleep,1000
SendAsc("在M群吹牛逼我们是认真的666")
Send,{enter}
return
SendAsc(str) {
Loop, Parse, str
If ( Asc(A_LoopField) <= 255 ) 
SendInput, % "{Asc " . Asc(A_LoopField) . "}" 
Else
SendInput, % A_LoopField
}
Sleep,1000

进入高级编辑器:

Run,C:\Users\Admin\Desktop\test.pbix,,Max
WinWait,test - Power BI Desktop
Sleep,3000
Click,160,140
Sleep,1000
Send,{tab 9}{enter}
Sleep,1000
Click,402,93
Sleep,1000
Send,{tab 2}{delete 23}
SendAsc("let 源=Text.ToList(""大衍之数五十,其用四十有九。"") in 源")
Send,{enter}
return
SendAsc(str) {
Loop, Parse, str
If ( Asc(A_LoopField) <= 255 ) 
SendInput, % "{Asc " . Asc(A_LoopField) . "}" 
Else
SendInput, % A_LoopField
}
Sleep,1000

参考微软Power BI Desktop快捷键相关章节内容:
https://docs.microsoft.com/zh-cn/power-bi/create-reports/desktop-accessibility-keyboard-shortcuts
https://docs.microsoft.com/en-us/power-bi/create-reports/desktop-accessibility-keyboard-shortcuts
PQ数据连接器自动化一般流程逻辑我总结为:
无弹窗模式(ESC可以将弹窗干掉或者配置下):打开PBIX->等待程序窗口加载完毕->Ctrl F6定位数据连接器区域->右箭头四次进入连接器选择菜单->enter->tab键两次定位第一个连接器子菜单->下箭头选择你需要的连接器即可->enter
打开excel工作簿连接器选择文件对话框在ctrl f6后直接ctrl space即可!
文件菜单在干掉弹窗后可以试下CTRL F6四次->enter
文件菜单在干掉弹窗后CTRL F6四次->tab回到主页菜单焦点上此时可以使用左右箭头定位另外几个主菜单
在定位到指定主菜单后想定位主菜单下的子菜单需要先tab键到该主菜单的第一个子菜单上然后使用左右箭头即可!
子菜单分为很多组的可用CTRL+右箭头在每组(剪切板、数据、查询、插入、计算、共享)的第一个子菜单之间切换。
所以另一种定位所有连接器对话框的完整方式为:
打开PBIX->等待程序窗口加载完毕->ESC干掉弹窗->ctrl f6四次->tab两次->四次右箭头(或CTRL+右箭头)->enter
当定位到获取数据子菜单时也可以使用ALT+下箭头,弹出下拉菜单供用户后续上下箭头选择指定连接器。
file
file
有弹窗模式:直接六次tab键回车即可进入连接器选择菜单,后续操作参考上面。
file
另外win+f10定位最大最小关闭菜单窗口,,,
例如进入空白查询编辑器后鼠标焦点在编辑栏,使用F6跳出,然后按两次TAB键定位到查询列表,利用上下箭头切换到指定查询,定位好查询后可以使用F2修改查询名称。
另外编辑器界面按下F10可以调出所有编辑界面主菜单的快捷键,比如主页H,如果我们要进入高级编辑界面直接按下H后再按字母Q即可,进入高级编辑器界面此时按下两次TAB即可操作M语句,比如CTRL A->删除键->然后就可以自己从0开始写M,写完M语句后按下F6->ENTER即可保存书写的M的整个查询所有步骤。
另外CTRL+f1可以折叠查询编辑器界面子菜单。
有了操作菜单的快捷键至于你使用什么工具脚本操作就不是问题了,,,
保存应用关闭界面:
F10->F->S
也可以直接F12调出另存为对话框,,,
F10->F后可以用上下键控制保存方式,如第一个关闭并应用查询数据。
可以配合ctrl键及alt加方向键操作保存位置等信息。

#m::
loop
{
Run,C:\Users\Admin\Desktop\test.pbix,,Max
WinWait,test - Power BI Desktop
Sleep,5000
WinActivate,test - Power BI Desktop
Send,{LControl down}{F6}{F6}{F6}{F6}{LControl up}
Send,{Tab 2}
Send,{LControl down}{Right 2}{LControl up}
Send,{Right}
Send,{enter}
Sleep,4000
WinClose,test - Power BI Desktop
Sleep,2000
Send,{enter}
Sleep,30000
}
return
#n::exitapp

PQ快捷键参考:https://docs.microsoft.com/zh-cn/power-query/keyboard-shortcuts

道高一尺 魔高一丈
https://pbihub.cn/users/44
M与DAX的恩怨纠葛