【Windows】Task Scheduler(批處理)

188 阅读7分钟

Document : learn.microsoft.com/zh-cn/windo…

1. Task Scheduler

1.我的電腦 -> 右鍵管理 -> 工作排程器

2.直接輸入命令 taskschd.msc

image.png

2. Bat

2.1 Command

pause: 如果想要查看運行的結果,可以暫停黑窗口

@echo on:顯示執行的命令

@echo off:不顯示執行的命令

2.2 File

echo. > file.txt 創建txt文檔

echo "content" > file.txt 寫入content到txt文檔,覆蓋

echo "content" >> file.txt 寫入content到txt文檔,追加

2.3 Delete

1.RD:删除目录 

  • /S:删除目录及目录下的所有子目录和文件。 

  • /Q: XP中的增强DOS命令 

    RD /S /Q在进行删除操作时将取消确认

2.DEL:删除文件或目录 

  • /F:可删除只读文件。 

  • /S、/Q:使用此参数即“DEL/S”作用与“RD/S”完全相同,即删除目录及目录下的所有子目录和文件。同时使用参数/Q,可取消删除操作时的系统确认。 

    del /f /s /q C:\log\*.*

image.png

::日志路径 
set log="D:\星程智慧物流系统\Logs"

:: 保留日志天数 
set bak=5 
:: 删除日志文件 
forfiles /p %log% /M "*.log" /D -%bak% /C "cmd /c del @file"
@echo off
set target_folder="C:\path\to\folder"
set days_to_keep=7
 
for /d %%d in ("%target_folder%*") do (
set "folder_age=%%~td - %date:~0,4%%-%%date:~5,2%%-%%date:~8,2%%"
if /i "%%~nxd" lss "folder_age" del "%%d\*" /s /q /f
)
 
for %%f in ("%target_folder%*") do (
if /i "%%~nxf" lss "today - %days_to_keep% days" del "%%f" /q /f
)
1.删除文件夹下的文件
del /f /s /q C:\Users\Administrator\AppData\Local\Temp\*.*

2.删除空文件夹
rd /s /q  C:\Users\dell\AppData\Local\Temp\A

3.删除文件和文件夹操作

del /f /s /q C:\Users\Administrator\AppData\Local\Temp\*.*
cd C:\Users\Administrator\AppData\Local\Temp
rd /s /q  C:\Users\Administrator\AppData\Local\Temp

2.4 DateTime

set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set hour=%time:~0,2%
set minute=%time:~3,2%
set second=%time:~6,2%
 
set timestamp=%year%%month%%day%%hour%%minute%%second%
echo %timestamp%

pause
:: get current datetime
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set dt=%%a
echo %dt%
set folderName=%dt:~0,6%
set day=%dt:~6,2%

2.5 Folder

set folder=%DATE%  
md "y:/%folder%"  
copy d:/DataBak/*.BAK "y:/%folder%"
rem CODE BY t0nsha   
rem 关于提取date,time输出结果的一个批处理   
rem “:”(冒号)和“~”波浪号必不可少!   
rem “~”后的数字:为正数表示舍弃输出结果的前几位;直接跟负数表示取到输出结果的后第几位。   
rem “,”后的数字:为正数表示取到输出结果的前第几位;为负数表示舍弃输出结果的后几位。   
echo %date%   
echo %date:~4%
@echo off

setlocal ENABLEEXTENSIONS
setlocal enabledelayedexpansion

rem 根据当前日期获取,年月日串
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set hour=%time:~0,2%
set minute=%time:~3,2%
set second=%time:~6,2%
 
set timestamp=%year%%month%%day%%hour%%minute%%second%
echo %timestamp%
echo "hello world">>%timestamp%.txt

rem get all file name in spec folder
rem set directory=F:\DSM\AOI_Script
set directory="%cd%"
set file_name_str=

for /f "delims=" %%i in ('dir /b %directory%') do (
	set file_name_str=!file_name_str! %%i
)

echo %file_name_str%

2.6 if

image.png

注意空格

@echo off
Set inputValue=15
if %inputValue%==15 (
    echo %inputValue%等于15
) 
if %inputValue% equ 15 (
    echo %inputValue%等于15
)
pause
@echo off

set inputValue=23

if %inputValue% gtr 100 (
	echo 大于100
) else if %inputValue% gtr 10 (
	echo 大于10
) else if %inputValue% gtr 0 (
	echo 大于0
)
pause
@echo off
set filepath=C:\ 
if exist %filepath% (
    echo %filepath%存在
) 
if not exist %filepath% (
    echo %filepath%不存在
)

2.7 跳出循環

@echo off
for /l %%i in (1,1,10) do (
    if %%i==5 goto endLoop
    echo %%i
)
:endLoop
echo "loop end"

2.8 Setlocal

SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"

SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"

SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"

SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"

2.9 Set

set #显示目前所有可用的变量,包括系统变量和自定义的变量

echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用

set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1

set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2

echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2

echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2

echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2

echo %p:~0,3% #显示前3个字符,即aa1

echo %p:~-2% #显示最后面的2个字符,即b2

echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b

echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2

echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2

echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2

set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2

set /a p=39 #设置p为数值型变量,值为39

set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3

set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用

set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?

set p= #取消p变量

set /p p=请输入 屏幕上显示”请输入”,并会将输入的字符串赋值给变量p

3. String

3.1 截取

%var%變量截取方法

@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0123456789
echo 原字符串(第二行为各字符的序号):
echo %ifo%
echo 123456789012345678901234567890123456
echo 截取前5个字符:
echo %ifo:~0,5%
echo 截取最后5个字符:
echo %ifo:~-5%
echo 截取第一个到倒数第6个字符:
echo %ifo:~0,-5%
echo 从第4个字符开始,截取5个字符:
echo %ifo:~3,5%
echo 从倒数第14个字符开始,截取5个字符:
echo %ifo:~-14,5%
pause

!var!變量的截取步驟相同

set "ifo=abcdefghijklmnopqrstuvwxyz0123456789"
echo 原字符串(第二行为各字符的序号):
echo !ifo!
echo 123456789012345678901234567890123456
echo 截取前5个字符:
echo !ifo:~0,5!
echo 截取最后5个字符:
echo !ifo:~-5!
echo 截取第一个到倒数第6个字符:
echo !ifo:~0,-5!
echo 从第4个字符开始,截取5个字符:
echo !ifo:~3,5!
echo 从倒数第14个字符开始,截取5个字符:
echo !ifo:~-14,5!

Demo

@echo off
echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause

3.2 replace

@echo off
set aa=伟大的中国!我为你自豪!
echo 替换前:%aa%
echo 替换后:%aa:中国=中华人民共和国%
echo aa = %aa%
set "aa=%aa:中国=中华人民共和国%"
echo aa = %aa%
pause

3.3 合併

@echo off
set aa=伟大的中国!
set bb=我为你自豪!
echo %aa%%bb%
echo aa=%aa%
echo bb=%bb%
set "aa=%aa%%bb%"
echo aa=%aa%
pause

4. get file Name

1.獲取文件名

@echo off & setlocal enabledelayedexpansion
set path=C:\Users\wangsq\Desktop
set file_name_str=
for /f "delims=" %%i in ('dir /b %path%') do (
    set file_name_str=!file_name_str! %%i
)

echo %file_name_str%
pause

2.獲取文件名

echo off

::"%cd%"当前文件夹;%DIR%设置一个变量
set DIR="%cd%"
echo DIR=%DIR%
 
:: 参数 /R 表示需要遍历子文件夹,去掉表示不遍历子文件夹
:: %%f 是一个变量,类似于迭代器,但是这个变量只能由一个字母组成,前面带上%%
:: 括号中是通配符,可以指定后缀名,*.*表示所有文件
for /R %DIR% %%f in (*.txt) do ( 
    echo %%f
)

3.獲取文件名

for %%i in (*.txt*) do echo "%%i"

4.獲取文件夾名

判断文件夹名称是否等于一个值
@echo off
for /d %%i in (*) do ( 
	echo %%i 
	if %%i==centosImages (
		pause
	)
)
pause
set DIR="%cd%"

:: delete folder 
for /d %%D in ("%DIR%\*") do (  
    echo %%i
)

5. Folder

set "DIR=F:\DEMO"
:: no care the folder is exist
md "%DIR%\!reportYear!\!reportDay!"

::move file
move !reportName! %DIR%\!reportYear!\!reportDay!

6. Delay

@echo off

setlocal ENABLEEXTENSIONS
setlocal enabledelayedexpansion

set "startNum=1"  
set "endNum=100"  
  
:: Loop  
for /L %%i in (%startNum%,1,%endNum%) do (
	:: delay 1s
	timeout /t 1 /nobreak >nul
	
	::write hello world
	echo hello world
)

endlocal
pause

7. Windows no Dispaly

1.在你写的批处理文件,开头加上以下三行代码即可

if "%1"=="hide" goto CmdBegin
start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit
:CmdBegin

2.创建一个xxx.vbs文件,裡面執行xxx.bat

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "e:\dba_tools\copy_file.bat",0