简单记录

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)

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/adding-columns-to-a-datatable

给 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 列名去掉空格

DataTable 列名去掉空格

或者循环里面直接使用

item.ColumnName = item.ToString.Trim

LINQ

LINQ 概述

https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/

https://www.yiibai.com/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

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 邮箱配置

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

直接进行转化的判断

DateTime.TryParse("2022/08/05", dtmdateValue)

DateTime.TryParseExact

提供日期格式的转化判断

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毫秒

UiPath_Delay500毫秒

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 )

SearchOption

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)

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile.createfromdirectory?view=net-5.0

文件解压

将指定 zip 存档中的所有文件都解压缩到文件系统的一个目录下。

System.IO.Compression.ZipFile.ExtractToDirectory(strZipFilePath,strUnzipFilePath,System.Text.Encoding.Default)

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile.extracttodirectory?view=net-5.0

获取文件路径

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:```


![Uipath打开远程桌面的文件管理器,指定路径](https://img.lbjheiheihei.xyz/img/20220416_Uipath打开远程桌面的文件管理器,指定路径.png?imageView2/0/format/webp/interlace/1/q/75 "Uipath打开远程桌面的文件管理器,指定路径")

### 设置已中断会话时间限制

为防止流程在系统启动后处于锁屏状态,通过设置 ”**已中断会话时间限制**“ 来让会话注销,达到每次进去之后都创建一个新的远程链接。

在运行中输入:**gpedit.msc** 打开本地组策略编辑器

计算机设置->管理模板->Windows 组件->远程桌面服务->远程桌面会话主机->会话时间限制

双击打开“**设置已中断会话的时间限制**”,选中“**已启用**”,“结束已断开连接的会话”设置为“**1分钟**”

## 输入法相关

### 切换为英文输入法

安装依赖 LanguageChange,然后使用控件Language Change Activity 切换成英文

![](https://img.lbjheiheihei.xyz/img/20220810_切换为英文输入法.png?imageView2/0/format/webp/interlace/1/q/75 "切换为英文输入法")

## 鼠标相关

### 鼠标滚轮上下滑动

安装依赖包: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

注:可以使用 PowerShell 实现

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填写数据特别慢

  1. Excel Scope 取消勾选 Save changes,填写完成后使用控件 Save Workbook
  2. 打开excel之后,先按下滚动条,滑动一下

Excel 自动填写数据

控件:Auto Fill Range

Excel 在表格里面筛选数据

前提:已有 excel 文件,里面的数据已经设置好筛选

使用控件:Filter Table,疑似对表有用,对透视表无用。

控件 Filter Table

别的都还好填写,但是 TableName 真的不知道在哪。

获取TableName

https://docs.uipath.com/activities/lang-zh_CN/docs/table-functions

第三方控件

官方的控件不够用的话,可以使用

BalaReva.Excel.Activities

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)

ODBC新建数据源

输入DNS名字以及描述、MySQL数据库的IP地址与端口,点击ok。点击 Details 展开,设置中文字符集。

OBDC设置

清空一个表

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 脚本编写

启用 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
}

浏览器设置

谷歌浏览器,下载前询问每个文件的保存位置

您的连接不是私密连接

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

弹出式窗口和重定向

弹出式窗口和重定向1

弹出式窗口和重定向2

弹出式窗口和重定向3

奇奇怪怪的坑

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

检查一下某些安全软件有没有升级,导致文件无法删除。