自定义Windows右击菜单调用Winform程序

U9_Gitignore文件处理

  1. 背景

U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak

文件 Enum.cs结尾的文件,还有许多 extand文件。 这些文件都不需要上传Git。

但是这些文件太多了,不可能手动加入到ignore文件中。就需要一个工具,自动生成ignore文件。

  1. 了解ignore文件的忽略规则

.gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

  1. .gitignore忽略规则的优先级

在 .gitignore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):

1)从命令行中读取可用的忽略规则

2)当前目录定义的规则

3)父级目录定义的规则,依次递推

4)$GIT_DIR/info/exclude 文件中定义的规则

5)core.excludesfile中定义的全局规则

  1. 匹配语法

.gitignore 文件中,每一行的忽略规则的语法如下:
1
空格不匹配任意文件,可作为分隔符,可用反斜杠转义
2
)以""开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。
3
)可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
4
)以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
5
)以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"**" 表示匹配任意中间目录,比如`a/**/z`可以匹配 a/z, a/b/z a/b/c/z等。
6
)以问号"?"通配单个字符,即匹配一个任意字符;
7
)以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有09的数字,[a-z]表示匹配任意的小写字母)。
8
)以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。

需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效

1

#               表示此为注释,将被Git忽略

2

*.a             表示忽略所有 .a 结尾的文件

3

!lib.a          表示但lib.a除外

4

/TODO           表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

5

build/          表示忽略 build/目录下的所有文件,过滤整个build文件夹;

6

doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

7

  

8

bin/:           表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

9

/bin:           表示忽略根目录下的bin文件

10

/*.c:           表示忽略cat.c,不忽略 build/cat.c

11

debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.objtools/debug/io.obj

12

**/foo:         表示忽略/foo,a/foo,a/b/foo

13

a/**/b:         表示忽略a/b, a/x/b,a/x/y/b

14

!/bin/run.sh    表示不忽略bin目录下的run.sh文件

15

*.log:          表示忽略所有 .log 文件

16

config.php:     表示忽略当前路径的 config.php 文件

17

  

18

/mtk/           表示过滤整个文件夹

19

*.zip           表示过滤所有.zip文件

20

/mtk/do.c       表示过滤某个具体文件

21

  

22

被过滤掉的文件就不会出现在git仓库中(gitlabgithub)了,当然本地库中还有,只是push的时候不会上传。

23

  

24

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:

25

!*.zip

26

!/mtk/one.txt

27

  

28

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?

29

想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::

30

/mtk/*

31

!/mtk/one.txt

32

  

33

假设我们只有过滤规则,而没有添加规则,

那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!

34

注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,

one.txt文件虽然加了!过滤规则,也不会生效!

35

  

36

----------------------------------------------------------------------------------

37

还有一些规则如下:

38

fd1/*

39

说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,

还是某个子目录 /child/fd1/ 目录,都会被忽略;

40

  

41

/fd1/*

42

说明:忽略根目录下的 /fd1/ 目录的全部内容;

43

  

44

/*

45

!.gitignore

46

!/fw/ 

47

/fw/*

48

!/fw/bin/

49

!/fw/sf/

50

说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/  /fw/sf/ 目录;

注意要先对bin/的父目录使用!规则,使其不被排除。

 

 

  1. 为U9创建Windows文件夹右击菜单

    1. 目的

在文件夹上右击,弹出菜单,点击为U9生成gitignore文件的菜单按钮,能将该文件夹下所有的BE,BP等忽略文件自动添加到.gitignore文件中。

  1. Windows文件夹右击菜单机制

右击菜单机制是卸载注册表中的。

路径为:计算机\HKEY_CLASSES_ROOT\Directory\shell

了解到这个之后可以自己添加一个右击菜单。

其原理就是再command节点下增加 默认的数据, 数据就是调用的exe路径。并且可以将当前点击的文件夹路径已参数的形式传递过去。

  1. 制作安装程序

  1. Application Folder

应用程序文件夹"即"Application Folder"表示要安装的应用程序需要添加的文件;

  1. User's Desktop

"用户桌面"即"User's Desktop"表示:这个应用程序安装完,用户的桌面上的创建的.exe快捷方式。

  1. User's Programs Menu

"用户的'程序'菜单"即"User's Programs Menu

Menu"表示:应用程序安装完,用户的"开始菜单"中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放:应用程序.exe和卸载程序.exe

  1. 写入注册表

我们需要再安装完成之后写入注册表信息,

所以需要一个继承System.Configuration.Install.Installer的类,可以重写

BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等方法 。

我们需要重写AfterInstall方法。

 

  1. 创建一个类库工程

类文件继承System.Configuration.Install.Installer

//绑定完成安装事件的处理方法

this.AfterInstall += InstallerClass_AfterInstall;

//绑定卸载完成后事件的处理方法

this.AfterUninstall += InstallerClass_AfterUninstall;

 

全部代码如下:

 

using System.Collections;

using System.ComponentModel;

using Microsoft.Win32;

 

namespace UFIDA.UBF.GitIgnoreClassLibrary

{

[RunInstaller(true)]

public class InstallerClass : System.Configuration.Install.Installer

{

 

private static string shellPath = "Directory\\shell";

private static string u9GitIgnore = "U9GitIgnore";

private static string initIgnoreFiles = "UFIDA.UBF.GitIgnoreFiles.WinForm.exe";

private static string contextMenuName = "[u9]自动生成git忽略文件";

public InstallerClass()

: base()

{

//绑定完成安装事件的处理方法

this.AfterInstall += InstallerClass_AfterInstall;

//绑定卸载完成后事件的处理方法

this.AfterUninstall += InstallerClass_AfterUninstall;

}

 

/// <summary>

/// 卸载之后,删除注册表

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void InstallerClass_AfterUninstall(object sender, System.Configuration.Install.InstallEventArgs e)

{

RegistryKey root = null;

RegistryKey rk = null;

RegistryKey u9 = null;

try

{

root = Registry.ClassesRoot;

rk = root.OpenSubKey(shellPath, true);

if (rk != null)

{

u9 = root.OpenSubKey(shellPath + "\\" + u9GitIgnore, true);

if (u9 != null)

{

rk.DeleteSubKeyTree(u9GitIgnore);

}

}

}

finally

{

if (root != null)

root.Close();

if (rk != null)

rk.Close();

if (u9 != null)

u9.Close();

}

 

}

 

 

/// <summary>

/// 安装完成之后写入注册表

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void InstallerClass_AfterInstall(object sender, System.Configuration.Install.InstallEventArgs e)

{

RegistryKey root = null;

RegistryKey rk = null;

RegistryKey u9key = null;

RegistryKey u9 = null;

try

{

//获取用户选择的安装路径

string path = this.Context.Parameters["targetdir"];

root = Registry.ClassesRoot;

rk = root.OpenSubKey(shellPath, true);

u9key = rk.CreateSubKey(u9GitIgnore);

u9key.SetValue("", contextMenuName);

u9 = root.OpenSubKey(shellPath + "\\" + u9GitIgnore, true);

var command = u9.CreateSubKey("command");

command.SetValue("", "\"" + path + "\\" + initIgnoreFiles + "\"" + " \"%1\"");

}

finally

{

if (root != null)

root.Close();

if (rk != null)

rk.Close();

if (u9key != null)

u9key.Close();

if (u9 != null)

u9.Close();

}

 

}

/// 重写安装过程方法

public override void Install(IDictionary stateSaver)

{

base.Install(stateSaver);

}

 

/// 重写卸载方法

public override void Uninstall(IDictionary savedState)

{

base.Uninstall(savedState);

}

 

/// 重写回滚方法

public override void Rollback(IDictionary savedState)

{

base.Rollback(savedState);

}

 

public override void Commit(IDictionary savedState)

{

base.Commit(savedState);

}

}

}

 

  1. 将上面的类文件添加到安装程序中

  1. 添加生成gitignore文件的程序exe

因为本程序还需要添加文件夹和文件,所以直接复制文件夹到Application Folder 中

 

打包的时候会将这些文件都安装进去。

  1. 添加自定义操作

可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择"主输出来自ClassLibrary(活动)"。这样,重新生成后,安装之后就会执行 OnAfterInstall代码了。 

 

因为在写入注册表过程中使用到了用户安装的文件夹路径,所以需要加上CustomActionData 参数: /targetdir="[TARGETDIR]\"

配置默认文件夹路径 YONYOU

  1. 生成

就可以右击安装项目生成了

  1. 安装

完成之后我们就可以看到注册表中已经添加上了。

  1. 查看

可以看到文件夹右击菜单中有刚才的按钮,点击就可以调用我们设置的exe程序,并将当前路径传到程序中。

  1. 注意-以管理员身份运行exe程序

右击exe项目属性,

在安全性中 勾选 启用ClickOnce安全设置

然后项目中会自动生成app.mainfest文件。打开该文件:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

asInvoker 替换为 requireAdministrator,保存

再将安全性中 启用ClickOnce安全设置 取消勾选

这样运行exe就是已管理员身份运行

转载于:https://www.cnblogs.com/alua/p/10524318.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

替换富文本里的px为rem

var content 23pxcontent content.replace(/(\d )px/g, function(s, t) {s s.replace(px, );var value parseInt(s) * 0.001; // 100px 1remreturn value "rem"; //0.23rem }); 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

centos7服务器文件同步,centos7文件实时同步工具lsyncd

1.本地目录同步# yum install lsyncd# vi /etc/lsyncd.conf------ User configuration file for lsyncd.---- Simple example for default rsync, but executing moves through on the target.---- For more examples, see /usr/share/doc/lsyncd*/examples/---- (注释掉这行)s…

Gradle Introduction

目录 Compileing development ProcessOld compile MothedModern compile MothedWhat is GradleGradle EffectWhat is GroovyGroovy syntax relesStructure ScriptPeojectAttributeTaskExample #1applyExample #1Example #2Dependency ManagementExample #1Example #2Multiple P…

命名空间的引用问题

1、using System.Data; 2、using System.Data.SqlClient; 添加引用的时候&#xff0c;只要添加System.Data “类型的初始值设定引发异常” “未能加载程序集或它的某一个依赖项”-------这种错误可能跟&#xff08;命名空间&#xff09;程序集的引用有关系 转载于:https://www.…

使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现

最近&#xff0c;我偶然发现了Java面试问题之一&#xff1a; “使用Java集合类实现最近使用的列表&#xff08;LRU&#xff09;缓存吗&#xff1f;” 如果您以前曾处理过类似的问题&#xff0c;那么对您来说真的很容易。 否则&#xff0c;您将开始考虑实现LRU缓存的最佳收集类…

sha1.js

function encodeUTF8(s) {var i, r [], c, x;for (i 0; i < s.length; i)if ((c s.charCodeAt(i)) < 0x80) r.push(c);else if (c < 0x800) r.push(0xC0 (c >> 6 & 0x1F), 0x80 (c & 0x3F));else {if ((x c ^ 0xD800) >> 10 0) //对四字节…

angular 获取ng-repeat完成状态 $last

$index $first $middle $last $odd $even html <ul><li ng-repeat"item in data" repeat-finish&#xff1d;"renderFinish()">{{item.str}}</li> </ul> 指令 app.directive(repeatFinish,function(){return {link: function(sco…

博客园-我的新的开始

励志学会,python,php-由于必须150字所以水一下 python: Python 是由 Guido van Rossum 在八十年代末和九十年代初&#xff0c;在荷兰国家数学和计算机科学研究所设计出来的。 Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C、Algol-68、SmallTalk、Unix …

Selenium备忘手册 [转]

最近的项目准备用Selenium作一部分的Regression Test。在SpringSide里参考了一下&#xff0c;又下了个Selenium IDE玩玩&#xff0c;觉得还蛮容易上手&#xff0c;基本上不需要手动写测试代码。 但实操起来时面对各种复杂的页面情况遇到不少麻烦。感觉Selenium 的offical d…

js中7种继承的实现和优缺点

原型链继承 function Parent(){this.name kevin }Parent.prototype.getName function(){console.log(this.name) }function Child(){} Child.prototype new Parent()var child new Child() console.log(child.name) //kevin优点&#xff1a; 简单&#xff0c;容易实现缺点&…

u8系统怎么连接服务器,用友U8 怎么连接远程服务器

用友U8 怎么连接远程服务器 内容精选换一换配置应用系统的跨云热备容灾方案如图1所示。在如图1所示的方案中&#xff0c;用户的生产数据中心的应用系统使用MySQL作为数据库&#xff0c;应用系统与MySQL均热备容灾到华为云上。用户的生产数据中心与华为云之间使用专线进行网络连…

使用Java 8 Streams进行编程对算法性能的影响

多年来&#xff0c;使用Java进行多范例编程已经成为可能&#xff0c;它支持面向服务&#xff0c;面向对象和面向方面的编程的混合。 带有lambda和java.util.stream.Stream类的Java 8是个好消息&#xff0c;因为它使我们可以将功能性编程范例添加到混合中。 确实&#xff0c;lam…

bind搭建(二)反向解析

我们在上一节已经知道了怎么建立DNS的服务器端&#xff0c;可以实现了域名到IP之间的转换。那么好我们现在就来了解一下如何实现反向的DNS解析&#xff0c;也就是IP到域名的映射。 步骤如下&#xff1a; l 在/etc/named中声明反向区域 l 在/var/named/chroot/var/named/中创建…

js求渐升数的第100位

我弟考了道数学竞赛题&#xff0c;问我能不能用代码算结果.. 题目是这样的 用 1、2、3、4、5 组合数字&#xff0c;然后排列大小&#xff0c;从小到大&#xff0c;求排在第100位的数值大小 function foo(chars) {var count 0;if (!chars.length) return;var _foo function(c…

[导入]商业智能2.0?(BI 2.0 from Timo Elliott)

译者注: 关于BI2.0的说法很多&#xff0c;不尽一致&#xff0c;目的只是想多了解一些&#xff1b;译文并不代表译者认可原文观点&#xff0c;只是顺便译了以方便不喜欢E文的朋友。本文是一篇充满探讨及疑问的文章&#xff0c;来自Timo Elliott(Business Objects历史上的第8号员…

poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)

1 /**2 problem: http://poj.org/problem?id32593 spfa判负环&#xff1a;4 当有个点被松弛了n次&#xff0c;则这个点必定为负环中的一个点&#xff08;n为点的个数&#xff09;5 spfa双端队列优化&#xff1a;6 维护队列使其dist小的点优先处理7 **/8 #include<stdio.h&g…

编写干净的测试–用特定领域的语言替换断言

很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 干净的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但是我认为该定义也适用于测试代码。 使测试尽可能具有可读性是我…

如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?

如何让MFC程序关闭按钮失效&#xff0c;也无法右击任务栏关闭窗口来关闭&#xff0c;即右键任务栏的关闭窗口失效呢&#xff1f;很简单&#xff0c;有一个小窍门就是&#xff1a;响应IDCANCEL消息&#xff0c;具体实现如下&#xff1a; 首先定义消息映射&#xff1a;ON_BN_CLIC…

令人眼睛一亮的履历表

令人眼睛一亮的履历表 你辛辛苦苦写的一份简历&#xff0c;可在人事经理眼里最多只是停留几十秒的时间。如果时机拿捏不好&#xff0c;它会给你造成麻烦&#xff1a;它可能暴露你的短处&#xff0c;而且基本目的都是供人淘汰之用。然而&#xff0c;当你必须做出履历表时&#…

angularjs封装bootstrap官网的时间插件datetimepicker

背景:angular与jquery类库的协作 第三方类库中&#xff0c;不得不提的是大名鼎鼎的jquery,现在基本上已经是国内web开发的必修工具了。它灵活的dom操作&#xff0c;让很多web开发人员欲罢不能。再加上已经很成熟的jquery UI 库和大量jquery 插件&#xff0c;几乎是一个取之不尽…