最近在调试网络通信,每次一有点小修改,都要将程序从开发机复制到测试机,不胜烦扰。既然我们程序猿,为什么要那么死板呢,能够用代码解决的问题,就不要用手去解决。
先说复制,我们除了手工复制就没有其他办法了吗?在命令提示符下面,我们用于管理文件和文件夹的命令多的是,比如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了。
嗯,我们看到这上面有可以连接远程系统,可以指定用户名,指定密码,指定进程的映像名(一般就是进程的执行文件名,如XX.exe)。这么好的东西,不拿来整蛊同事简直对不起自己,我已经脑补了同事的explorer.exe被我结束后一脸茫然的样子,做好事,不留名,请叫我雷锋。
于是我迫不及待的开始了实验(不要在意我是怎么知道密码这些细节,我是站在背后偷看的)
尼玛,怎么跟想象的不一样。问题出在哪里?
上网一查一对,原来问题出在防火墙上,关了防火墙(根据网络类型选择相应的防火墙)在测试机上检验,果然可以使用了。
当然,在实际使用中,关掉防火墙是不安全的做法,可以进行如下操作。
- 依次选择控制面板->Windows防火墙->高级设置
- 在高级安全Windows防火墙中选择入站规则
- 找到远程计划任务管理(RPC),配置文件为专用、公用,启用规则。