一、场景
远程主机上部署了服务程序,每天产生日志文件,名字以日期命名,形如
log-total-2021-03-08.0.log
虽然远程主机部署了FTP服务器,但是还需要下载到本地才可以进行查看。在工作中,不是每天都进行日志的查看,因此,过几天后需要将这期间的日志下载到本地进行分析。(如果是大型服务器,就不要这样子啦!)
需要分两步做这种工作:
- 确定起止日期
- 动手去复制
想着以后需要重复做这种工作,因此还是让程序做这些事情吧。
二、先看结果
三、解决思路
3.1 使用Power Shell前的纠结
原来想着基于CMD批处理命令.bat
进行编写,写着写着发现获取日期差的函数太费劲,转而走向了Power Shell的.ps1
面向对象的编程,和JAVA的思想是一致的。在.bat
中的几十行的代码在.ps1
中只要几行就可以解决。心里直呼舒服啊,放弃.bat吧。
3.2 获取文件怎么搞呢?
想到了curl,几乎是每个程序员都知道的网络工具,在Power Shell中直接调用。微软实现了阉割版的curl工具包,其实是Invoke-WebRequest
命令,很是鸡肋。
如果想调用真正的curl,直接输入curl.exe + 参数,至此你熟悉的命令(你的快乐)
又回来了。
curl.exe 参数
3.3 远程获取文件逻辑
- 搭建FTP服务端,开启FTP端口服务
- 增量获取日志文件(上一次和这一次的获取的文件量的差)
- curl循环下载
3.4 不贴源码等于耍流氓
write-host "Starting to get Log Files From Remote Terminal..." $work_path="C:\Users\86134\Desktop\total\total\" cd $work_path #文件列表 $file_array = ls #获取当前文件夹中最新的日志文件的日期,为什么是-2呢,因为我本地的文件夹里还有个其他文件 $last_date = $file_array[-2].name.SubString(10,10) #获取远程和本地日志文件的日期差 $days_diff = (New-TimeSpan $([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)) $([System.DateTime]::Now)).Days - 1 write-host "The days of diff is :"$days_diff #要获取的日志文件名 $file_list= [String[]] @() for($i=0;$i -lt $days_diff;$i++) { $file_list += ([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)).addDays($i + 1).toString("yyyy-MM-dd") } #循环下载文件 for($i=0;$i -lt $file_list.Count;$i++) { $temp_date = $file_list[$i] write-host "Starting get the file of date :"$temp_date curl.exe -# -O ftp://name:password@ip/log-total-$temp_date.0.log }
至此就可以看到第二节的结果了。
3.5 还是原来的配方,封装成.bat
命令
.ps1
文件需要在命令行中执行,不能够双击运行。因此,需要将其封装为.bat
命令,直接双击运行,最后再封装成服务开机自启动,完成脚本自动化执行。
四、优化
通过对比本地日志文件和远程主机日志文件的区别,获取差集。
write-host "Starting to get Log Files From Remote Terminal..." $work_path="C:\Users\86134\Desktop\total\total\" cd $work_path #文件列表 $file_array = ls #获取当前文件夹中最新的日志文件的日期,为什么是-2呢,因为我本地的文件夹里还有个其他文件 $last_date = $file_array[-2].name.SubString(10,10) #获取远程和本地日志文件的日期差 $days_diff = (New-TimeSpan $([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)) $([System.DateTime]::Now)).Days - 1 #远程主机日志文件参考数组对象 $remote_File_Array = curl.exe -s --ftp-ssl -k ftp://user:password@ip/ write-host "Remote host log file count is:"$remote_File_Array.length $remote_File_Name_Array = [String[]] @() #获取远程主机上的日志文件名 for($i=0;$i -lt $remote_File_Array.length;$i++){ $remote_File_Name_Array += $remote_File_Array[$i].subString(39); } #获取本机日志文件 $local_file_Array = [String[]] @() for($i=0;$i -lt $file_array.Count;$i++){ #write-host $file_array[$i].name $local_file_Array += $file_array[$i].name } write-host "Local host log file count is:"($local_file_Array.length-1) write-host "The days of diff is :"$days_diff #要获取的其它文件 $other_file_Array = [String[]] @() #求出本地日志文件和远程日志文件的差集 for($i=0;$i -lt $remote_File_Name_Array.Count;$i++){ $check = $false for($j=0;$j -lt $local_file_Array.Count;$j++){ if($remote_File_Name_Array[$i] -eq $local_file_Array[$j]){ $check=$true break } } if(!$check){ $other_file_Array += $remote_File_Name_Array[$i] } } #循环下载日志文件 for($i=0;$i -lt $other_file_Array.Count;$i++) { write-host "Starting get the file :"$other_file_Array[$i] $temp_file_name = $other_file_Array[$i] curl.exe -# -O ftp://user:password@ip/$temp_file_name }