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_colorecho命令的封装,方便在终端输出不同颜色的字体;
其代码如下:

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
}
posted @ 2022-03-12 05:25  晴云孤魂  阅读(208)  评论(0编辑  收藏  举报