Cygwin/WSL一键备份或导入Windows计划任务实用函数示例(backup-schtasks、restore-schtasks)
backup-schtasks() {
## 备份并导出Windows任务计划为XML文件
# backup-schtasks all/-a ;备份本机所有的计划任务
# backup-schtasks ;仅备份 子路径“\Cygwin自用\”下的计划任务
# backup-schtasks '\自定义备份路径\' ;备份【自定义路径】下的计划任务
# Lonelyer注:此备份貌似有问题:备份时可以一次性备份文件夹下多个任务,但导入时一次只能导入一个任务
OLD_IFS=$IFS
IFS=$(echo -e "\n")
local apppath="schtasks"
local bakdir=~/.backup
local schbakpath='\Cygwin自用\'
#备份命令:schtasks /Query /TN '\Cygwin自用\' /XML ONE
if [ "$(type -t $apppath)" == "file" ];then
[ ! -d "$bakdir" ] && mkdir $bakdir
local backupName=$(cygpath -u `basename $apppath`)
# local backupPath=$(cygpath -u `dirname $apppath`)
if [ ! -z "$1" ]; #$1可指定要备份的路径
then
if [[ "${1,,}" == "-a" || "${1,,}" == "all" ]];
then
local schbakpath='\'
echo -e "备份本机所有任务计划..."
else
local schbakpath=$1
fi
fi
print_color "backup Windows计划任务 $apppath ... to $bakdir"
# tar -zcvf $bakdir/${backupName}_$(date +"%Y%m%d-%H%M%S").tar.gz -C $backupPath $backupName
gsudo schtasks /Query /TN $schbakpath /XML ONE >$(cygpath -aw "$bakdir/Windows_${backupName}_$(date +"%Y%m%d-%H%M%S").xml")
print_color 33 "Done...."
else
print_color 9 "program not found!\npath:${apppath//\\/\\\\} "
fi
IFS=$OLD_IFS
}
restore-schtasks() {
## 导入计划任务:从XML备份文件导入到Windows计划任务
## restore-schtasks /path/to/xxxx.xml ;导入指定的xml任务备份文件
OLD_IFS=$IFS
IFS=$(echo -e "\n")
local apppath="schtasks"
local bakdir=~/.backup
local profilename="Windows_${apppath}_"
if [ ! -z "$1" ] && [[ ! "$1" =~ ^\\ ]];
then
if [ -f "$1" ];
then
local backupFile=$(cygpath -au $1)
else
local backupFile=$(ls -t $bakdir/${1}*|head -n 1)
fi
echo "自定义导入文件:$backupFile"
shift
else
local backupFile=$(ls -t $bakdir/${profilename}*|head -n 1)
fi
#是否定义了导入路径?
local importPATH=""
if [ ! -z "$1" ]
then
local importPATH=$1
fi
if [ ! -z "$backupFile" ];then
local backup=$(cygpath -aw $backupFile)
print_color "backup file store in $bakdir"
print_color "restore $backupFile to Windows计划任务..."
TasksFind=$(cat $backupFile|xmllint --noenc --xpath '//*[local-name()="Tasks"]' - 2>/dev/null|wc -l)
if [ $TasksFind -eq 0 ];
then
#XML文件为单任务备份文件
TaskName=$(cat $backupFile|iconv -s -f UTF-16 -t UTF-8|xmllint --noenc --xpath '//*[local-name()="Task"]/*[local-name()="RegistrationInfo"]/*[local-name()="URI"]/text()' -)
[ ! -z "$importPATH" ] && TaskName=$importPATH$(basename $TaskName)
# 获取当前电脑当前用户的User Sid替换xml,否则无法导入
userSidInfo=$(PATH="$ORIGINAL_PATH" cmd /c whoami /user)
userSid=$(echo "$userSidInfo"|tail -n 1|awk '{printf $2}')
awk -i inplace '/<UserId>/{getline;print "<UserId>'"${userSid}"'</UserId>"}{print}' $(cygpath -au "$backupFile")
echo -e "导入单任务:$TaskName ..."
gsudo SCHTASKS /Create /F /XML $backup /TN $TaskName
else
#XML文件为多个任务合一备份文件,拆分并导入~
echo -e "XML为多任务文件,进行拆分并导入..."
/v/bin/restore-tasks-from-xml $backupFile $importPATH
fi
print_color 33 "Done...."
else
print_color 9 "Backup file not found!\npath:${backupFile//\\/\\\\} "
fi
IFS=$OLD_IFS
}
依赖的print_color
为echo
命令的封装,方便在终端输出不同颜色的字体;
其代码如下:
print_color() {
## print_color 打印带颜色的文字
# $1 -- 颜色编号,(可省略);缺省为3 ——绿色字
# $2 或 $* -- 打印的文字内容
# -----------------------------
:<<EOF
echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
例如:
echo -e "\033[47;30m I love Android! \033[0m"
其中47的位置代表背景色, 30的位置是代表字体颜色,需要使用参数-e,man echo 可以知道-e enable interpretation of backslash escapes。
----------
See Also:
https://www.cnblogs.com/fengliu-/p/10128088.html
EOF
if [ $# -eq 0 ];
then
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
echo
echo -e "See Also:\n\thttps://www.cnblogs.com/fengliu-/p/10128088.html"
return
fi
local color=3 #默认颜色
#判断第一个参数是否为纯数字,如果是数字,则认定为设定颜色编号
if [ $# -ge 2 ];
then
expr $1 "+" 10 &> /dev/null
if [ $? -eq 0 ];then
local color=$1
shift
fi
fi
local str="$*"
case $color in
1)
echo -e "\033[30m${str}\033[0m"
;;
2)
echo -e "\033[31m${str}\033[0m"
;;
3)
echo -e "\033[32m${str}\033[0m"
;;
4)
echo -e "\033[33m${str}\033[0m"
;;
5)
echo -e "\033[34m${str}\033[0m"
;;
6)
echo -e "\033[35m${str}\033[0m"
;;
7)
echo -e "\033[36m${str}\033[0m"
;;
8)
echo -e "\033[37m${str}\033[0m"
;;
9)
#红底白字
echo -e "\033[41;37m${str}\033[0m"
;;
10)
#白底黑字
echo -e "\033[47;30m${str}\033[0m"
;;
33)
#绿底黄字
echo -e "\033[42;33m${str}\033[0m"
;;
37)
#蓝底白字
echo -e "\033[44;37m${str}\033[0m"
;;
40)
#黑底黄字
echo -e "\033[40;33m${str}\033[0m"
;;
41)
#红底黄字
echo -e "\033[41;33m${str}\033[0m"
;;
*)
#蓝底白字
echo -e "\033[44;37m${str}\033[0m"
;;
esac
}
本文来自博客园,作者:晴云孤魂,转载请注明原文链接:https://www.cnblogs.com/cnhack/p/15996089.html