VS编译完成后自动复制到远程机器

缘起

最近在调试网络通信,每次一有点小修改,都要将程序从开发机复制到测试机,不胜烦扰。既然我们程序猿,为什么要那么死板呢,能够用代码解决的问题,就不要用手去解决。

解决过程

复制

手工复制外有没有其他办法了?这个时候大家一定会想到批处理。在命令提示符下面,我们用于管理文件和文件夹的命令比较多,比如RENAME、DEL、COPY用于文件,MKDIR、RMDIR、XCOPY用于目录。

如果查看常用的命令,可以通过在命令提示符中输入Help进行查看,如下图:

1

我们需要复制整个目录,所以使用XCOPY命令(如果只复制单个文件,也可以用COPY),XCOPY的常用参数如下:

2

我们需要的是到远程机器上,但是命令是在本机上操作。我们可以把远程机器的目录共享,就像操作本机磁盘一样,那么这些命令也是适用的。

共享

共享的步骤如下(熟悉的可直接跳过,以Win7系统为例):

  1. 在待共享的文件夹,在右键上单击属性,切换到共享选项卡
  2. 单击共享按钮,在弹出的文件共享对话框中添加用户(添加用户需要在文本框中单击三角形按钮选择用户)
  3. 设置权限(因为我们要复制文件所以选择读取/写入)
    3
    在图中,我选择的是EveryOne,所有用户。出于安全考虑,不建议这样做
  4. 在浏览器中输入我们共享的文件夹地址,输入用户名密码,这样就可以在命令提示符中直接使用命令复制了(如果关闭了密码保护密码共享,可省略这一步,但是Windows中默认是打开的,关闭是在控制面板->网络和共享中心->更改高级共享设置中)

好了,我们现在知道如何通过命令复制文件夹到远程计算机上了,但是不会每次都通过命令复制吧,这样还不如直接手动复制了。当然不会了,我们的VS不是别人称为宇宙最强IDE么,当然考虑到这一点了,就是生成事件了。

生成事件

生成事件包括生成前事件和生成后事件,分别是在编译开始之前和编译完成之后进行的自定义处理。

在C++项目中,生成事件在项目的属性页中设置

4

在C#中,也在项目的属性页中设置

5

我们可以编辑生成事件,VS在其中定义了许多宏(C++中更多),如项目名称、生成平台、输出目录等。下面仅以C#为例简单说明:

单击编辑后期生成事件,在弹出的窗口中单击宏按钮,在宏列表中单击相应的宏名称,即可插入宏变量到编辑框中,组合宏变量和常见的命令,即可实现很丰富的功能,如上面的拷贝文件到远程计算机。除了使用命令,我们还可以调用批处理,如上图所示,在批处理前面加上call。注意:批处理的当前目录是指工程的输出目录(即在生成中设置的输出目录,默认即binDebug或者binRelease)

远程关进程

上面一切看起来工作的很好。但是,有时候我调试发现了Bug,直接在开发机上运行,却报生成失败,原来是生成后事件未成功运行。再一查,是测试机上没有关掉对应的程序。这个问题怎么解决呢?

在命令行下,杀进程可以通过taskkill,那么它能不能杀远程进程呢?查看帮助。如下图:

6

可以看出taskkill可以连接远程系统、指定用户名、指定密码、指定进程的映像名(一般就是进程的执行文件名,如XX.exe)。

于是测试:

7

尼玛,怎么跟想象的不一样。问题出在哪里?

hehe

RPC服务器不可用的解决办法

这个问题我没思路,但是我没思路,别人不一定没有啊。上网一查一对,原来问题出在防火墙上,关了防火墙(根据网络类型选择相应的防火墙)在测试机上检验,果然可以使用了。

当然,在实际使用中,关掉防火墙是不安全的做法,可以进行如下操作。

  1. 依次选择控制面板->Windows防火墙->高级设置
  2. 在高级安全Windows防火墙中选择入站规则
  3. 找到远程计划任务管理(RPC),配置文件为专用、公用,启用规则。
    8
原文地址:https://www.cnblogs.com/yiyan127/p/VS_AutoCopy.html