以下是 BAT文件内容 批处理
@echo OFF
运行 升级程序文件名 下载地址 应用主进程
start ___go_build_updata_go https://dldir1.qq.com/qqfile/qq/ ... 5_241009_x86_01.exe QQ.exe
代码开源
[C] 纯文本查看 复制代码 package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
)
// 定义一个全局变量name,用于存储文件名
var name = ""
// WriteCounter是一个用于统计写入字节数的结构体
type WriteCounter struct {
Total uint64
}
// Write方法实现了io.Writer接口,用于统计写入的字节数并打印进度
func (wc *WriteCounter) Write(p []byte) (int, error) {
n := len(p)
wc.Total += uint64(n)
wc.PrintProgress()
return n, nil
}
// PrintProgress方法用于打印下载进度
func (wc WriteCounter) PrintProgress() {
// 清除之前的进度信息
fmt.Printf("\r%s", strings.Repeat(" ", 35))
// 打印新的进度信息,单位为MB
fmt.Printf("\r文件已下载: %d MB ", wc.Total/(1024*1024))
}
func main() {
// 检查命令行参数数量,如果不足2个则提示错误并返回
if len(os.Args) < 2 {
fmt.Println("请提供至少一个参数!")
return
}
// 获取命令行参数
arg := os.Args[1]
var aru = os.Args[2]
// 打印下载地址和主程序进程信息
fmt.Println("下载地址:", arg)
fmt.Println("主程序进程:", aru)
// 杀死指定名称的进程
exec.Command(`taskkill`, `/f`, `/t`, `/im`, aru).Run()
// 从URL中提取文件名和文件大小
fileName, err := extractFileNameFromURL(arg)
if err != nil {
fmt.Println("Error:", err)
return
}
fileSize, err := getFileSizeFromURL(arg)
if err != nil {
fmt.Println("Error:", err)
return
}
// 打印正在下载的提示信息和文件大小
fmt.Println("正在下载 请稍后.......")
fmt.Printf("文件大小: %.2f MB\n", fileSize)
// 开始下载文件
name = fileName
fileUrl := arg
err = DownloadFile(fileName, fileUrl)
if err != nil {
panic(err)
}
// 下载完成打印提示信息
fmt.Println("下载完成")
}
// DownloadFile函数用于下载文件
func DownloadFile(filepath string, url string) error {
// 创建文件
out, err := os.Create(filepath + ".tmp")
if err != nil {
return err
}
defer out.Close()
// 发送HTTP GET请求
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// 使用WriteCounter统计写入字节数
counter := &WriteCounter{}
_, err = io.Copy(out, io.TeeReader(resp.Body, counter))
if err != nil {
return err
}
// 关闭文件
fmt.Print("\n")
out.Close()
// 重命名文件
err = os.Rename(filepath+".tmp", filepath)
if err != nil {
return err
}
// 执行下载的文件
exec.Command(".\\" + name).Run()
os.Exit(0)
return nil
}
// extractFileNameFromURL函数用于从URL中提取文件名
func extractFileNameFromURL(downloadURL string) (string, error) {
// 解析URL
parsedURL, err := url.Parse(downloadURL)
if err != nil {
return "", err
}
// 获取路径部分
path := parsedURL.Path
// 提取文件名
fileName := filepath.Base(path)
return fileName, nil
}
// getFileSizeFromURL函数用于从URL中获取文件大小
func getFileSizeFromURL(downloadURL string) (float64, error) {
// 发送HEAD请求
resp, err := http.Head(downloadURL)
if err != nil {
return 0, err
}
defer resp.Body.Close()
// 从响应头中获取Content-Length字段
contentLengthStr := resp.Header.Get("Content-Length")
if contentLengthStr == "" {
return 0, fmt.Errorf("Content-Length header not found")
}
// 将Content-Length字符串转换为整数
contentLength, err := strconv.ParseInt(contentLengthStr, 10, 64)
if err != nil {
return 0, err
}
// 将字节转换为MB
return float64(contentLength) / (1024 * 1024), nil
}
GO语言自动更新测试程序.part1.rar
(2 MB, 下载次数: 4)
|