VS编译完成后自动复制到远程机器
缘起
最近在调试网络通信,每次一有点小修改,都要将程序从开发机复制到测试机,不胜烦扰。既然我们程序猿,为什么要那么死板呢,能够用代码解决的问题,就不要用手去解决。
解决过程
复制
手工复制外有没有其他办法了?这个时候大家一定会想到批处理。在命令提示符下面,我们用于管理文件和文件夹的命令比较多,比如RENAME、DEL、COPY用于文件,MKDIR、RMDIR、XCOPY用于目录。
如果查看常用的命令,可以通过在命令提示符中输入Help进行查看,如下图:
我们需要复制整个目录,所以使用XCOPY命令(如果只复制单个文件,也可以用COPY),XCOPY的常用参数如下:
我们需要的是到远程机器上,但是命令是在本机上操作。我们可以把远程机器的目录共享,就像操作本机磁盘一样,那么这些命令也是适用的。
共享
共享的步骤如下(熟悉的可直接跳过,以Win7系统为例):
- 在待共享的文件夹,在右键上单击属性,切换到共享选项卡
- 单击共享按钮,在弹出的文件共享对话框中添加用户(添加用户需要在文本框中单击三角形按钮选择用户)
- 设置权限(因为我们要复制文件所以选择读取/写入)
在图中,我选择的是EveryOne,所有用户。出于安全考虑,不建议这样做 - 在浏览器中输入我们共享的文件夹地址,输入用户名密码,这样就可以在命令提示符中直接使用命令复制了(如果关闭了密码保护密码共享,可省略这一步,但是Windows中默认是打开的,关闭是在控制面板->网络和共享中心->更改高级共享设置中)
好了,我们现在知道如何通过命令复制文件夹到远程计算机上了,但是不会每次都通过命令复制吧,这样还不如直接手动复制了。当然不会了,我们的VS不是别人称为宇宙最强IDE么,当然考虑到这一点了,就是生成事件了。
生成事件
生成事件包括生成前事件和生成后事件,分别是在编译开始之前和编译完成之后进行的自定义处理。
在C++项目中,生成事件在项目的属性页中设置
在C#中,也在项目的属性页中设置
我们可以编辑生成事件,VS在其中定义了许多宏(C++中更多),如项目名称、生成平台、输出目录等。下面仅以C#为例简单说明:
单击编辑后期生成事件,在弹出的窗口中单击宏按钮,在宏列表中单击相应的宏名称,即可插入宏变量到编辑框中,组合宏变量和常见的命令,即可实现很丰富的功能,如上面的拷贝文件到远程计算机。除了使用命令,我们还可以调用批处理,如上图所示,在批处理前面加上call。注意:批处理的当前目录是指工程的输出目录(即在生成中设置的输出目录,默认即bin\Debug或者bin\Release)
远程关进程
上面一切看起来工作的很好。但是,有时候我调试发现了Bug,直接在开发机上运行,却报生成失败,原来是生成后事件未成功运行。再一查,是测试机上没有关掉对应的程序。这个问题怎么解决呢?
在命令行下,杀进程可以通过taskkill,那么它能不能杀远程进程呢?查看帮助。如下图:
可以看出taskkill可以连接远程系统、指定用户名、指定密码、指定进程的映像名(一般就是进程的执行文件名,如XX.exe)。
于是测试:
尼玛,怎么跟想象的不一样。问题出在哪里?
RPC服务器不可用的解决办法
这个问题我没思路,但是我没思路,别人不一定没有啊。上网一查一对,原来问题出在防火墙上,关了防火墙(根据网络类型选择相应的防火墙)在测试机上检验,果然可以使用了。
当然,在实际使用中,关掉防火墙是不安全的做法,可以进行如下操作。