简单记录
- DataTable相关
- LINQ
- String相关
- 选取器(Selectors)
- 数据操作
- 邮件相关
- 时间相关
- 文件相关
- 环境相关
- Windows 系统相关
- Http请求
- 短信(验证码)相关
- Excel相关
- VBA相关
- SQL
- 正则
- SAP
- bat脚本(命令行)
- PowerShell
- 浏览器设置
- 奇奇怪怪的坑
- ctrl v 失效
- Selector 能找到元素,但是运行报错 time out
- 客户机的系统和服务器日期不为同一天
- 选择元素,F2倒计时结束后元素消失
- Cannot find the UI element corresponding to this selector
- Cannot communicate with the browser, please check the UiPath extension
- 你要允许来自未知发布者的此应用对你的设备进行更改吗?
- 以管理员身份运行Uipath应用程序
- Block User Input 锁不了鼠标键盘
- 批量插入数据(Insert DataTable)到数据库报错
- UiPath Data Scraping只能抓取网页表格的数据
- 报错:Scrape returned empty text
- 能运行的代码,突然有一天不能运行了1
- 能运行的代码,突然有一天不能运行了2
DataTable相关
新建一个空的DataTable
New System.Data.DataTable
DataTable.Select()
使用sql语法筛选数据
dt.Select("[semployerName] like '*[*]*' or [semployerName] like '*''*' ")
Datatable Filtered_Results = dt.Select("[Column1]=’"+param_1+"’ AND [Column2]=’"+param_2+"’").CopyToDataTable()
https://www.cnblogs.com/TeresaMu/p/12058559.html
https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datatable.select?view=net-5.0
DataTable.AsEnumerable()
筛选数据
dt.AsEnumerable().Where(Function(y) y.Item("semployerName").ToString.Contains("'") or y.Item("semployerName").ToString.Contains("*")).ToList()
https://forum.uipath.com/t/checking-special-characters-in-column-values-in-data-table/14599/2
DataTable.Clone()
克隆可创建具有与原始 DataTable 相同的结构的新 DataTable,但不复制任何数据(新 DataTable 将不会包含任何 DataRows
)。
https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datatable.clone?view=net-5.0
DataTable.Copy()
同时将结构和数据复制到新 DataTable 中,使用 Copy。
给 DataTable 添加列(指定位置)
SetOrdinal(0)里面的 0 就是想添加到的位置。
dt.Columns.Add("列名").SetOrdinal(0)
dt.Columns.Add("列名", typeof(String)).SetOrdinal(0)
给 DataTable 添加列(指定位置、默认值)
Dim column As DataColumn
column = New DataColumn("日期")
column.DefaultValue = strBalanceDate
dtBankDataTable.Columns.Add(column)
column.SetOrdinal(0)
DataTable 调整列的顺序
将顺序调到第4列,计数从0开始
dt.Columns("ColumnName").SetOrdinal(4)
DataTable 判断是否存在某列
dt.Columns.Contains("列名")
DataColumn转list
( From row In dt.AsEnumerable() Select Convert.Tostring(row("列名")) ).ToList()
DataTable 去重1
Remove Duplicate Rows
DataTable 去重2
NameList = (From name in dtAllDataTable.Columns.Cast(of DataColumn) select name.ColumnName).ToArray
dvDataView = dtAllDataTable.DefaultView
dtAllDataTable = dvDataView.ToTable(True, NameList)
DataTable 列名去掉空格
TypeArgument : System.Data.DataColumn
或者循环里面直接使用
item.ColumnName = item.ToString.Trim
LINQ
https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/
String相关
String 大写
str.ToUpper
String 小写
str.ToLower
转成两位精度小数
Double.Parse("1.2").ToString("0.00")
Double.Parse("1").ToString("f")
判断能不能转换为整数
Integer.TryParse("asd",0)
输出为:False
Integer.TryParse("123",0)
输出为:True
转成百分比
Double.Parse("0.5").ToString("p")
https://docs.microsoft.com/zh-cn/dotnet/api/system.double.tostring?view=net-5.0
SecurePassword
获取或设置 SecureString 实例形式的密码。
secStrPassWord = New System.Net.NetworkCredential("","123456").SecurePassword
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.networkcredential
Password
获取或设置与凭据关联的用户名的密码。
New System.Net.NetworkCredential("",pwd).Password
字符串加双引号
"test""Test" + """"
输出:test”Test”
String.Format补全0
Strings.Format(7, "000")
输出:007
也可以:https://docs.microsoft.com/zh-cn/dotnet/api/system.string.padleft?view=net-6.0
String去掉前面的0
"0000abc".TrimStart("0".ToCharArray)
输出:abc
https://docs.microsoft.com/zh-cn/dotnet/api/system.string.trimstart?view=net-6.0
String 换行
"asdf"+ _
"dssffg"
输出:asdfdssffg
String 替换掉换行
str.Trim.Replace( Chr(10) , "").Replace( Chr(13) , "")
String 分割
Split(str, ",")
str.split(CChar(","))
str.Split(","c)
str.Split(convert.ToChar(","))
str.Split(Char.Parse(","))
https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/split-function
Substring 截取
从第六个字符开始,截取两个字符
str.Substring(6,2)
https://docs.microsoft.com/zh-cn/dotnet/api/system.string.substring?view=net-6.0
替换匹配
System.Text.RegularExpressions.Regex.Replace(text, "\W","")
判断字符串是否为Null或者为空字符串
String.IsNullOrEmpty(String)
https://docs.microsoft.com/zh-cn/dotnet/api/system.string.isnullorempty?view=net-6.0
选取器(Selectors)
动态选取器
MenuOption 为变量
<wnd app='notepad.exe' cls='Notepad' title='Untitled - Notepad' />
<ctrl automationid='MenuBar' idx='1' name='Application' role='menu bar' />
<ctrl name='' role='menu item' />
https://docs.uipath.com/studio/lang-zh_CN/docs/dynamic-selectors
正则表达式搜索
<wnd app='applicationframehost.exe' title='Calculator' />
<uia cls='LandmarkTarget' />
<uia automationid='CalculatorResults' name='Display is \d' role='text' matching:name='regex' />
https://docs.uipath.com/studio/lang-zh_CN/docs/regex-search
数据操作
新建一个List
New List(Of String)
实例化一个List
New List(Of String) From {"1", "2", "3"}
List去重
list.Distinct().ToList
判断List里面是否包含某字符
list.Contains(str)
新建字典
New Dictionary(Of String,Object) From{ {"异常结果收件邮箱",""}, {"发件邮箱账号密码凭据","发件邮箱账号密码"}, {"RobotWorkFolder","C:\Robots\asdf"} }
遍历字典的键
for key in dic.Keys
遍历字典的值
for value in dic.Values
遍历字典
For Each 的 TypeArgument 选择 KeyValuePair
键:item.Key
值:item.Value
String 转 list
, 为分隔符
str.Split( CChar(",") ).ToList
Base64 转 Byte Array
Convert.FromBase64String( strImageBase64 )
Byte Array 保存为图片
File.WriteAllBytes( strImgPath, arrByteArray )
快速输出 list
先转为Array,然后再处理
join(list.ToArray,"、")
生成一个随机数
范围是 0 到 9
Cint( Rnd()*9 )
范围是 10 到 100
New Random().Next(10, 100)
范围是1到15
New Random(DateTime.Now.Millisecond).Next(1, 15)
邮件相关
内容 | 代码 |
---|---|
发件时间 | mail.Headers(“Date”) |
邮件时间 | mail.DateAsDateTime |
发件地址 | mail.From.Address |
邮件标题 | mail.Subject.ToString |
附件数量 | mail.Attachments.Count |
邮件正文 | mail.Body |
邮件正文里面带图片
strMailBody = "邮件里面的文字信息"
byteArray = File.ReadAllBytes(strScreenshotPath)
strPicBase64 = Convert.ToBase64String(byteArray)
strPicHtml = "<img src=data:image/jpeg;base64," + strPicBase64 + ">"
"<html><body>"+ strMailBody + strPicHtml +"</body></html>"
163 邮箱配置
关闭SSL验证
System.Net.ServicePointManager.ServerCertificateValidationCallback =
Function(se As Object,
cert As System.Security.Cryptography.X509Certificates.X509Certificate,
chain As System.Security.Cryptography.X509Certificates.X509Chain,
sslerror As System.Net.Security.SslPolicyErrors) True
时间相关
字符串转为DateTime
转换为 DateTime 变量,一般是够用的
Convert.ToDateTime("2022/05/25")
DateTime.Parse("2022/05/25")
如果格式特别奇怪的话,可以使用 DateTime.ParseExact:
DateTime.ParseExact( "Tue May 25 18:11:19 CST 2022", "ddd MMM dd HH:mm:ss CST yyyy", Nothing)
DateTime.ParseExact( "Tue May 25 18:11:19 CST 2022", "ddd MMM dd HH:mm:ss CST yyyy", New System.Globalization.CultureInfo("en-US") )
将日期时间的字符串转换为 DateTime
strReceiptime = "Wed, 15 Dec 2021 15:00:04 +0800"
format = "ddd, dd MMM yyyy HH:mm:ss zzz (CST)"
strReceiptime = "Wed, 15 Dec 2021 15:00:04 +0800 (CST)"
format = "ddd, dd MMM yyyy HH:mm:ss zzz (CST)"
DateTime.ParseExact(strReceiptime, format, System.Globalization.CultureInfo.InvariantCulture)
https://docs.microsoft.com/zh-cn/dotnet/api/system.datetime.parseexact
https://blog.csdn.net/bigheadsheep/article/details/12013267
判断能否把字符串转化为DateTime
直接进行转化的判断
DateTime.TryParse("2022/08/05", dtmdateValue)
提供日期格式的转化判断
DateTime.TryParseExact("20220805", "yyyyMMdd", Nothing, System.Globalization.DateTimeStyles.None, dtmdateValue)
Subtract
输出时间差
Time1 = DateTime.now()
Time2 = DateTime.now()
System.TimeSpan diff1 =Time1.Subtract(Time2)
System.TimeSpan diff2 =Time2-Time1
https://docs.microsoft.com/zh-cn/dotnet/api/system.datetime.subtract?view=net-6.0
Subtract(DateTime) | 返回一个新的 TimeSpan,从此实例的值中减去指定的日期和时间。 |
---|---|
Subtract(TimeSpan) | 返回一个新的 DateTime,从此实例的值中减去指定持续时间。 |
DateDiff
输出时间差,DateInterval.Second是秒数,DateInterval.Minute 是分钟数,DateInterval.Day 是日期数
DateDiff(DateInterval.Minute, Time1,Time2)
https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.dateandtime.datediff?view=net-6.0
https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.dateinterval?view=net-6.0
TimeSpan 结构
https://docs.microsoft.com/zh-cn/dotnet/api/system.timespan?view=net-6.0
Delay 500毫秒
00:00:00.500
New TimeSpan(0, 0, 0, 0,500)
文件相关
获取某文件夹下的所有 .csv 文件
Directory.GetFiles("C:\Robots\asdf", "*.csv")
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.directory.getfiles?view=net-6.0
获取某文件夹下的所有 .xls 文件的数量
Directory.GetFiles("C:\Robots\asdf","*.xls").Count
获取某文件夹下,包含子文件夹的所有文件
Directory.GetFiles( in_strInputPath, "*" , SearchOption.AllDirectories )
AllDirectories | 1 | 在搜索操作中包括当前目录和所有它的子目录。 此选项在搜索中包括重解析点,比如安装的驱动器和符号链接。 |
---|---|---|
TopDirectoryOnly | 0 | 仅在搜索操作中包括当前目录。 |
获取文件大小(字节数)
code
fileSize = FileLen(filePath).ToString
文件重命名
code
FileSystem.Rename(oldPathName,newPathName)
文件压缩
strSourcePath, 压缩的目录路径;strZipFilePath, 要生成压缩包的所在路径。strZipFilePath 貌似不能在 strSourcePath 里面。
code
System.IO.Compression.ZipFile.CreateFromDirectory(strSourcePath, strZipFilePath)
文件解压
将指定 zip 存档中的所有文件都解压缩到文件系统的一个目录下。
System.IO.Compression.ZipFile.ExtractToDirectory(strZipFilePath,strUnzipFilePath,System.Text.Encoding.Default)
获取文件路径
Path.GetDirectoryName("C:\Robots\港股通权限补报送\港股通权限补报送_日志表.xlsx")
运行结果:C:\Robots\港股通权限补报送
获取文件扩展名
Path.GetExtension("C:\Robots\港股通权限补报送\港股通权限补报送_日志表.xlsx")
运行结果:.xlsx
获取文件名
Path.GetFileName("C:\Robots\港股通权限补报送\港股通权限补报送_日志表.xlsx")
运行结果:港股通权限补报送_日志表.xlsx
获取文件名,不带扩展名
Path.GetFileNameWithoutExtension("C:\Robots\港股通权限补报送\港股通权限补报送_日志表.xlsx")
运行结果:港股通权限补报送_日志表
获取文件名所在的根目录
Path.GetPathRoot("C:\Robots\港股通权限补报送\港股通权限补报送_日志表.xlsx")
运行结果:C:\
当前用户的临时文件夹的路径
Path.GetTempPath
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.path.gettemppath?view=net-6.0&tabs=windows
环境相关
获取当前文件夹路径
Environment.CurrentDirectory
字符串组合成路径
Path.Combine(Environment.CurrentDirectory,"Data")
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.path.combine?view=net-5.0
文件在远程桌面的路径
Path.Combine("\\tsclient\", in_Config("RobotWorkFolder").ToString.Replace(":\","\"), strFileName)
获取文件夹里面最新的一个文件
Directory.GetFiles(Environment.CurrentDirectory,"Exceptions_Screenshots\").OrderByDescending(Function(d) New FileInfo(d).CreationTime)(0)
Windows 系统相关
自动登录Windows
免费:https://www.logonexpert.com/freeautologon/
付费:LogonExpert(可试用),配置好之后就可以自动登录Windows系统了
命令行使用:
"C:\Program Files\Softros Systems\LogonExpert\le.exe" -logon username [password][domain]
详细信息请参考:https://www.logonexpert.com/help/command-line/
如果有域名的话,一定要加上域名。
也可以在LogonExpert Administrator 配置好,然后直接使用
"C:\Program Files\Softros Systems\LogonExpert\le.exe" -logon *
启动进程
WorkingDirectory:如果未设置该属性,则默认工作目录为 %SYSTEMROOT%\system32。
UiPath 的控件 Open Application 打开应用,除非指定工作目录,否则都是默认使用 %SYSTEMROOT%\system32
NewProcess = New System.Diagnostics.Process
NewProcess.StartInfo.CreateNoWindow = False '是否创建窗口
NewProcess.StartInfo.FileName = '文件名称
NewProcess.StartInfo.Arguments = " " + argInstrArguments '参数
NewProcess.StartInfo.WorkingDirectory = '工作目录
NewProcess.StartInfo.UseShellExecute = '是否使用shell来执行
NewProcess.Start() '启动进程
NewProcess.WaitForExit() '等待进程退出
System.Diagnostics.Process.Start 用法
https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.process?view=net-6.0
打开文件管理器
System.Diagnostics.Process.Start("explorer.exe")
打开文件管理器,指定路径
System.Diagnostics.Process.Start("explorer.exe", "C:\Users\lbj\Documents\ChromeDownloads")
打开文件管理器,选中指定文件
System.Diagnostics.Process.Start("explorer.exe", "/select,"+ "C:\Users\lbj\Documents\ChromeDownloads\031002100311_43538867.pdf" )
打开远程桌面的文件管理器,指定路径
Argument:文件夹路径
FileName:”C:\Windows\explorer.exe”
Selector:```

### 设置已中断会话时间限制
为防止流程在系统启动后处于锁屏状态,通过设置 ”**已中断会话时间限制**“ 来让会话注销,达到每次进去之后都创建一个新的远程链接。
在运行中输入:**gpedit.msc** 打开本地组策略编辑器
计算机设置->管理模板->Windows 组件->远程桌面服务->远程桌面会话主机->会话时间限制
双击打开“**设置已中断会话的时间限制**”,选中“**已启用**”,“结束已断开连接的会话”设置为“**1分钟**”
## 输入法相关
### 切换为英文输入法
安装依赖 LanguageChange,然后使用控件Language Change Activity 切换成英文

## 鼠标相关
### 鼠标滚轮上下滑动
安装依赖包:ScrollActivity
### 鼠标移动到具体的元素位置
控件:Hover
### 鼠标循环滚动到具体的元素位置
循环 + 控件:Hover
### 鼠标移动指定的距离
Uipath 实现起来挺麻烦的,cmd 使用工具 [nircmd](http://www.nirsoft.net/utils/nircmd.html) 可以实现,但是 nircmd 会报毒(实测火绒、360)。
鼠标位置相对移动 movecursor [X] [Y]
move the mouse cursor. The **[X]** and **[Y]** parameters specifies the number of pixels to move.
Example: movecursor 100 100
```shell
nircmdc movecursor 100 100
Http请求
安装依赖包 UIPath.WebAPI.Activities
短信(验证码)相关
使用短信猫、双卡助手(安卓)、短信转发器 (安卓)、 IFTTT(安卓)、Tasker(安卓)、快捷指令(iOS 半自动)、来转发短信。
可以查看影刀的文档
Excel相关
Write Range 后的数据不对
使用 Workbook 的 Write Range,不要使用 Excel 的 Write Range。前者的单元格格式是文本,后者则不一定。
Excel 去重
使用 Remove Duplicates Range,如果数据是A到Z列,则范围填写A:Z
无法导入 UiPath 生成的 Excel 文件
SAP或者别的应用,可能是因为 UiPath 生成的 Excel 文件不带有用户信息?
需要信任一下才能导入 Excel 文件
Write Range报错: Cannot write to the target range because it has hidden rows. Remove any filters or unhide rows and try again.
打开的 Excel 里面的 Sheet 有隐藏的行或者列,无法使用 Excel 的 Write Range,但是可以用 Workbook 的 Write Range
一个一个cell填写数据特别慢
- Excel Scope 取消勾选 Save changes,填写完成后使用控件 Save Workbook
- 打开excel之后,先按下滚动条,滑动一下
Excel 自动填写数据
控件:Auto Fill Range
Excel 在表格里面筛选数据
前提:已有 excel 文件,里面的数据已经设置好筛选
使用控件:Filter Table,疑似对表有用,对透视表无用。
别的都还好填写,但是 TableName 真的不知道在哪。
https://docs.uipath.com/activities/lang-zh_CN/docs/table-functions
第三方控件
官方的控件不够用的话,可以使用
VBA相关
UiPath 运行VBA,前置操作
Excel:
如果报错 Invoke VBA: 不信任到 Visual Basic Project 的程序连接,那么去 Excel 的 文件-> 选项,找到信用中心,点击信用中心设置。
接着找到宏设置, 在开发人员宏设置里面勾选「启用所有宏 」、「信任对VBA工程对象模型的访问」
WPS:
设置1、开发工具->宏安全性->可靠发行商, 勾选信任对于”Visual Basic 项目”的访问。
设置2、文件->选项->信任中心,勾选【启用宏后自动添加为受信任的文档】。
VBA删除Sheet页
delSheet.txt 的内容:
Sub Deletesheet(sheetName)
Sheets(sheetName).Delete
End Sub
想删除的是 Sheet2
VBA删除Sheet
Function DeleteSheet(in_StrFilePath, in_StrSheetName As String) As String
Application.DisplayAlerts = False '禁止弹窗
Application.ScreenUpdating = False '禁止显示
On Error GoTo Myerr '异常处理
Dim Wb_Root As Workbook
Set Wb_Root = Workbooks.Open(in_StrFilePath, 0)
'初始化结束
Wb_Root.Sheets(in_StrSheetName).Delete
Wb_Root.Save
Wb_Root.Close
Myerr:
DeleteSheet = Err.Description
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Function
VBA 删除C列为空的行
Worksheets("指数转化表").Columns("c:c").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
若C列没有空的数据,会报错【未找到单元格】。
VBA 删除指定范围的行
Worksheets("指数转化表").Range("H20:N1171").EntireRow.Delete
VBA从最后一行删到指定行
Sheet<指数转化表>, 从最后一行开始删数据,删到第20行指数转化表>
Dim i As Integer
For i = Worksheets("指数转化表").UsedRange.Rows.Count To 20 Step -1
Worksheets("指数转化表").Rows(i).Delete
Next i
VBA 从指定行开始删数据
Sheet<指数转化表>, 从20行开始删数据指数转化表>
Worksheets("指数转化表").UsedRange.Offset(20).Delete
注:对表不可用,会报错【不允许此操作,因为它会移动工作表上表格中的单元格】
VBA粘贴数据
Wb_Root.ActiveSheet.Paste
VBA自动调整所选列列宽
调整 i 列的列宽
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.Range("i:i").EntireColumn.AutoFit
End Sub
Error
Error对象
Description | 设置或返回一个描述错误的字符串 |
Number | (缺省属性)设置或返回指定一个错误的值 |
Source | 设置或返回产生错误的对象的名称 |
Clear | 清除当前所有的Err对象设置 |
Raise | 产生一个运行期错误 |
https://docs.microsoft.com/zh-cn/office/vba/api/excel.error
SQL
MySQl 配置 ODBC
执行 sql 前,需要安装 mysql-connector-odbc (32位的),安装完成后打开ODBC数据源(32位),选择用户DSN,随后点击添加。
选择 MySQL ODBC Unicode Driver(旧版本只有 MySQL ODBC Driver)
输入DNS名字以及描述、MySQL数据库的IP地址与端口,点击ok。点击 Details 展开,设置中文字符集。
清空一个表
TRUNCATE TABLE 表名;
把一个表的数据去重放入另一个表
vcp_all 表不设置主键,vcp_distinct 表设置主键。
如果 all 表有,distinct 表没有,则会把数据插入到 distinct 表;
如果 all 表有,distinct 表也有,则会把 distinct 表的数据更新;
replace INTO vcp_distinct select * from vcp_all;
正则
日期是否是yyyy/MM/dd
^[12]\d{3}/(?:0[1-9]|1[0-2])/(?:0[1-9]|[12][0-9]|30|31)$
获取数字
用正则把非数字的字符去掉
System.Text.RegularExpressions.Regex.Replace( str, "[^0-9]+", "")
获取英文
用正则把非英文的字符去掉
System.Text.RegularExpressions.Regex.Replace( str, "[^A-Za-z]+", "")
获取中文
用正则把非中文的字符去掉
System.Text.RegularExpressions.Regex.Replace( str, "[^\u4e00-\u9fa5]]+", "")
判断字符串中是否含有5个下划线
System.Text.RegularExpressions.Regex.Matches(str,"_").Count=5
匹配日期(年-月-日)
匹配(年-月-日)格式日期
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
匹配数字+英文
[A-Za-z0-9]+$
匹配数字+英文(至少是五位)
[A-Za-z0-9]+${5,}
匹配数字+英文+()()_(至少是五位)
[A-Za-z0-9\+\-()\(\)]+${5,}
匹配中文
pattern: “[\u4e00-\u9fa5]+”
匹配非中文
[^\u4e00-\u9fa5]
SAP
启用 SAP GUI 脚本编写
bat脚本(命令行)
在远程控制的使用可以使用 bat 脚本来实现某些功能
修改cmd窗口编码为UTF-8
chcp 65001
创建虚拟磁盘
把 C:\O32_d 映射到 H 盘
@echo off
C:\Windows\System32\Subst H: C:\O32_d
Pause
删除虚拟盘
取消 H 盘的映射
@echo off
C:\Windows\System32\Subst H: /d
Pause
杀进程
以 UiPath.Executor 为例,可以在任务管理器的详细信息里面找到执行的程序名称。
taskkill /f /t /im UiPath.Executor.exe
7Zip 压缩文件
a:将文件添加到压缩档案中 b:测试压缩或解压算法执行时的 CPU 占用 d:从压缩档案中删除文件 e:将压缩档案中的所有文件解压到指定路径,所有文件将输出到同一个目录中 h:计算文件的哈希值 i:显示有关支持格式的信息 l:列出压缩档案的内容 rn:重命名压缩档案中的文件 t:测试压缩档案的完整性 u:更新要进入压缩档案中的文件 x:将压缩档案中的所有文件解压到指定路径,并包含所有文件的完整路径
"C:\Program Files\7-Zip\7z.exe" a 压缩包路径 压缩文件路径
7Zip 解压文件
-o和解压路径不要用空格分开
"C:\Program Files\7-Zip\7z.exe" x 压缩包路径 -o解压路径
WinRAR 压缩文件
压缩文件的一般命令行命令语法为:
WinRAR A [-参数] <压缩文件> [文件] [@文件列表]压缩文件>
例如说,您希望添加文件 LETTER.TXT 到压缩文件 LETTERS.RAR ,请输入:
WinRAR A LETTERS.RAR LETTER.TXT
建议是使用
WinRAR A -ep1 LETTERS.RAR LETTER.TXT
添加文件夹 “c:\latest data” 到压缩文件 Info.rar 中
WinRAR a Info.rar "c:\latest data"
WinRAR 解压文件
解压压缩文件 Info.rar 到文件夹 d:\data
WinRAR x Info.rar d:\data\
xcopy 复制文件
把 D:\666 文件夹下面的所有文件和文件夹复制到E:\777,其中不包含空的文件夹,不提示是否要覆盖现有目标文件。
xcopy "D:\666" "E:\777" /s /e /y
把 D:\666 文件夹下面的 *_compare_result.xlsx 复制到E:\777,不提示是否要覆盖现有目标文件。
xcopy "D:\666\*_compare_result.xlsx" "E:\777" /y
https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy
PowerShell
PowerShell 移动鼠标一段距离(X轴)
使用控件:Invoke Power Shell
勾选:IsScript
Paramenters:MoveX、speed
参数说明:MoveX 为 X 轴要移动的距离,可以为正,可以为负;speed 为移动的速度,实际为 Sleep 的毫秒数。
实际效果:在当前位置上,鼠标在X轴移动一段距离
Param(
[Parameter(Mandatory=$true)] [int32]$MoveX, # X轴要移动的距离,可以为正,可以为负
[Parameter(Mandatory=$true)] [Int32]$speed # 移动的速度,实际为 Sleep 的毫秒数
)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# $MoveX = -100 # X轴要移动的距离
$MoveCount = 0 # 移动的次数
while($MoveX -gt 0) # 遍历到 MoveX 为 0。-ge :大于等于,如果 MoveX 大于等于0,则进入循环
{
$MoveX = $MoveX-1
$x = [Windows.Forms.Cursor]::Position.X+1 # 鼠标当前 X 轴的位置 +1
$y = [Windows.Forms.Cursor]::Position.Y # 鼠标当前 Y 轴的位置
$MoveCount= $MoveCount +1
if ($MoveCount -eq 10) # 如果移动的次数等于10,则随机变动一下位置,可以去掉,感觉也不太好用。
{
$RandomX = Get-Random -Minimum -1 -Maximum 1 # 随机数,最小为-1,最大为1
$RandomY = Get-Random -Minimum -1 -Maximum 1 # 随机数,最小为-1,最大为1
$x = $x + $RandomX
$y = $y + $RandomY
$MoveCount = 0 # 移动的次数归零
}
[Windows.Forms.Cursor]::Position = new-object Drawing.Point $x,$y
Start-Sleep –m $speed
}
while($MoveX -le 0) # 遍历到 MoveX 为 0 。-le :小于等于,如果 MoveX 小于等于0,则进入循环
{
$MoveX = $MoveX+1
$x = [Windows.Forms.Cursor]::Position.X-1 # 鼠标当前 X 轴的位置 -1
$y = [Windows.Forms.Cursor]::Position.Y # 鼠标当前 Y 轴的位置
$MoveCount = $MoveCount +1
if ($MoveCount-eq 10) # 如果移动的次数等于10,则随机变动一下位置,可以去掉,感觉也不太好用。
{
$RandomX = Get-Random -Minimum -1 -Maximum 1 # 随机数,最小为-1,最大为1
$RandomY = Get-Random -Minimum -1 -Maximum 1 # 随机数,最小为-1,最大为1
$x = $x + $RandomX
$y = $y + $RandomY
$MoveCount = 0 # 移动的次数归零
}
[Windows.Forms.Cursor]::Position = new-object Drawing.Point $x,$y
Start-Sleep –m $speed
}
移动鼠标到指定位置
使用控件:Invoke Power Shell
勾选:IsScript
Paramenters:x3、y3、speed
参数说明:speed 为移动的速度,实际为 Sleep 的毫秒数。
使用说明:这里其实是三阶贝塞尔曲线,当前鼠标位置为起点,而(x1,y1)、(x2,y2) 为控制点,(x3,y3) 为终点。
实际效果:在当前位置上,鼠标开始移动到指定位置
代码思路借鉴了https://www.techotopia.com/index.php/Drawing_Graphics_using_PowerShell_1.0_and_GDI%2B,只不过别人是画图,我是移动鼠标。没有办法,暂时没找到更拟人的轨迹。
可以考虑学习:https://zhuanlan.zhihu.com/p/58284406
#
Param(
[Parameter(Mandatory=$true)] [Int32]$x3,
[Parameter(Mandatory=$true)] [Int32]$y3,
[Parameter(Mandatory=$true)] [Int32]$speed # 移动的速度,实际为 Sleep 的毫秒数
)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$x0 = [Windows.Forms.Cursor]::Position.X # 鼠标当前 X 轴的位置
$y0 = [Windows.Forms.Cursor]::Position.Y # 鼠标当前 Y 轴的位置
$x1 = 100 #
$y1 = 100 #
$x2 = 800 #
$y2 = 800 #
# $x3 = 500 # 目标 X 轴的位置
# $y3 = 500 # 目标 Y 轴的位置
$u = 0 #
while($u -le 1)
{
$u = $u+0.005
$x = [math]::pow( (1-$u) , 3) * $x0 + 3 * [math]::pow( (1-$u) , 2) * $u * $x1 + 3 * [math]::pow( ($u) , 2) * (1-$u) *$x2 + [math]::pow( ($u) , 3) * $x3
$y = [math]::pow( (1-$u) , 3) * $y0 + 3 * [math]::pow( (1-$u) , 2) * $u * $y1 + 3 * [math]::pow( ($u) , 2) * (1-$u) *$y2 + [math]::pow( ($u) , 3) * $y3
[Windows.Forms.Cursor]::Position = new-object Drawing.Point $x,$y
Start-Sleep –m $speed
}
浏览器设置
谷歌浏览器,下载前询问每个文件的保存位置
谷歌浏览器,设置关闭所有窗口时清除 Cookie 及网站数据
您的连接不是私密连接
solution1:
- 在当前页面点击一下,然后用键盘输入 thisisunsafe ,不是在地址栏输入,是直接敲键盘。
- 因为Chrome不信任这些自签名ssl证书,为了安全起见,直接禁止访问。thisisunsafe 这个命令,说明你已经了解并确认这是个不安全的网站,你仍要访问就给你访问了。
solution2
- 打开chrome://flags
- 找到“Show in-form warnings for sensitive fields when the top-level page is not HTTPS”设置为 disabled
- 找到 “Allow invalid certificates for resources loaded from localhost”设置为 “enabled”
- 点启用,然后重启浏览器
solution3
设置 chrome忽略证书错误
使用 –ignore-certificate-errors 参数命令行打开谷歌浏览器
谷歌浏览器黑屏
原因:可能是因为软件和显卡不兼容
解决办法:禁用硬件加速
打开谷歌浏览器加上参数 –disable-gpu –disable-software-rasterize
弹出式窗口和重定向
奇奇怪怪的坑
ctrl v 失效
ctrl c + ctrl v,无法把复制的内容粘贴到 Excel 文件里面,只输入了一个 v.
原因:未知
解决办法:Send Hotkey 控件勾选 SendWindowMessage.
Selector 能找到元素,但是运行报错 time out
开发时,使用控件的Selector 是能够定位到元素的,但是实际运行的时候,却报错,显示 time out。
原因:网站的问题,网页其实还在加载中,一直都在加载,会加载很久,但是不影响正常使用。
解决办法:WaitForReady 属性选择 None
客户机的系统和服务器日期不为同一天
使用到人民币银行结算账户管理系统,登录的时候提示【客户机的系统和服务器日期不为同一天】。
原因:未知
解决办法:用IE浏览器,把网站添加到兼容性视图。
选择元素,F2倒计时结束后元素消失
F2之后,直接鼠标按住元素,倒计时结束后能看到元素,选择元素。
Cannot find the UI element corresponding to this selector
背景信息:确认有元素,且不会变动,selector 验证是通过的,但是运行的时候报错。
异常情况:selector 不止一个 /selector 不对
解决办法1:图像识别
解决办法2:不要用 attach window
解决办法3:把界面最小化之后,再去点击。
Cannot communicate with the browser, please check the UiPath extension
背景信息:uipath扩展程序没有问题
异常情况:报错说连接不到浏览器,检查一下uipath扩展程序
解决办法:看看输入的浏览器的地址是否为空,为空则跳过
你要允许来自未知发布者的此应用对你的设备进行更改吗?
Solution1:
点击显示详细信息,选择何时显示更改通知,改为【从不通知】
不太推荐
Solution2:
- Win + R,输入 regedit,然后回车。
- 在注册表编辑器内,找到HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
-
提前把 .exe 文件的路径复制
- 在空白处右键,选择新建,字符串值,把复制的路径填入
- 在数值数据处,输入 RunAsInvoker
- 点击确定,完成
Solution3:
如果是远程机器使用 UiPath RemoteRuntime 的话,可以考虑去找到UiPath RemoteRuntime.exe 的路径,右键,在属性里面的兼容性里,勾选以管理员身份运行此程序
以管理员身份运行Uipath应用程序
识别元素报错:无法访问目标流程!可能需要提升权限,尝试以管理员身份运行Uipath应用程序。
如果是识别本机元素,那就找到 UiPath.Studio.exe 、UiPath.Executor.exe、UiRobot.exe ,勾选以管理员身份运行此程序。
如果是识别远程机器的元素,那就在远程的机器里面,找到 UiPath RemoteRuntime.exe ,勾选以管理员身份运行此程序。
勾选以管理员身份运行此程序的方式:找到指定 exe 文件,右键,点击属性,在兼容性里面,勾选【以管理员身份运行此程序】
Block User Input 锁不了鼠标键盘
用 ToDesk 连接到别的机器的话,确实不行…
以管理员身份运行UiPath.Executor.exe,没用;
以管理员身份运行UiPath Studio,再执行流程,直接报错
RemoteException wrapping System.AggregateException: One or more errors occurred. (拒绝访问。) ---> RemoteException wrapping System.ComponentModel.Win32Exception: 拒绝访问。
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetOrOpenProcessHandle()
at System.Diagnostics.Process.EnsureWatchingForExit()
at System.Diagnostics.Process.set_EnableRaisingEvents(Boolean value)
at UiPath.Service.UserHost.AttendedServiceProxy.RegisterClientProcess(Int32 clientPid)
at UiPath.Service.UserHost.StudioOperations.Prepare(ClientProcessMessage message, CancellationToken ct)
at UiPath.Service.Core.Utils.TaskUtils.WithShortWait(Task task, TimeSpan wait)
at UiPath.Service.UserHost.StudioOperations.<>c__DisplayClass7_0.<<RunJob>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.CancellationHelper`1.Invoke[TResult](TId requestId, Func`2 func)
at UiPath.CoreIpc.Server.<>c__DisplayClass7_3.<<-ctor>g__InvokeMethod|6>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Server.<>c__DisplayClass7_1.<<-ctor>g__HandleRequest|3>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Server.<>c__DisplayClass7_2.<<-ctor>b__5>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Helpers.Timeout[TResult](TimeSpan timeout, List`1 cancellationTokens, Func`2 func, String message, Func`2 exceptionHandler)
--- End of inner exception stack trace ---
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetOrOpenProcessHandle()
at System.Diagnostics.Process.EnsureWatchingForExit()
at System.Diagnostics.Process.set_EnableRaisingEvents(Boolean value)
at UiPath.Service.UserHost.AttendedServiceProxy.RegisterClientProcess(Int32 clientPid)
at UiPath.Service.UserHost.StudioOperations.Prepare(ClientProcessMessage message, CancellationToken ct)
at UiPath.Service.Core.Utils.TaskUtils.WithShortWait(Task task, TimeSpan wait)
at UiPath.Service.UserHost.StudioOperations.<>c__DisplayClass7_0.<<RunJob>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.CancellationHelper`1.Invoke[TResult](TId requestId, Func`2 func)
at UiPath.CoreIpc.Server.<>c__DisplayClass7_3.<<-ctor>g__InvokeMethod|6>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Server.<>c__DisplayClass7_1.<<-ctor>g__HandleRequest|3>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Server.<>c__DisplayClass7_2.<<-ctor>b__5>d.MoveNext()
--- End of stack trace from previous location ---
at UiPath.CoreIpc.Helpers.Timeout[TResult](TimeSpan timeout, List`1 cancellationTokens, Func`2 func, String message, Func`2 exceptionHandler)
批量插入数据(Insert DataTable)到数据库报错
查询没问题,单条插入也没问题,就是批量插入有问题。
报错:
ERROR [42000] [MySQL][ODBC 3.51 Driver][mysqld-8.0.28]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT VALUES' at line 1
解决办法:
把 UiPath.Database.Activities 版本改为 1.4.0
UiPath Data Scraping只能抓取网页表格的数据
问题:只能抓取表格的数据,不能单独爬取一列一列的数据。
selector还会有点问题,像 window 软件的 selector
<ctrl role='grouping' text='展开' />
而不像是网页的selector,
<webctrl aaname='展开' tag='SPAN' />
解决办法:重启 Uipath Studio
报错:Scrape returned empty text
ocr识别的时候出图像错,因为图像没加载出来,但是元素存在。
能运行的代码,突然有一天不能运行了1
检查一下最近有没有安装什么软件,导致冲突了。
注:特指福昕阅读器。
检查一下有没有什么软件自动更新,导致出现问题了。
注:特指福昕阅读器。
只是看 PDF 的话,SumatraPDF 其实也可以的,
能运行的代码,突然有一天不能运行了2
检查一下某些安全软件有没有升级,导致文件无法删除。