参考

https://sites.google.com/site/yao27bat/home/basic/bat1

命令帮助

通用方式xxx /?

注意

执行命令中路径包含空格,应该加上双引号””

执行指定脚本

1
start xxx.bat

注意:脚本文件编码应该使用 utf-8

指定窗口名称-常用!!!

1
start cmd /c "title 名字XXX && java -jar -Dfile.encoding=utf-8 C:\tongchuan\svn\emergency\jeecg-module-emergency-start\target\jeecg-module-emergency-start.jar"

文件

当前目录内查找指定文件

1
2
> dir|findstr nginx
------ 2020/7/21 10:17 2966 nginx.conf

拷贝文件到指定目录-批量查找拷贝

从指定目录批量拷贝文件到指定目录

1
2
3
4
5
6
7
8
9
copy 1652057527584_1652057527585.pdf  D:\bak\1652057527584_1652057527585.pdf
copy 1652057599024_1652057599024.pdf D:\bak\1652057599024_1652057599024.pdf
copy 1651917975647_1651917975647.pdf D:\bak\1651917975647_1651917975647.pdf
copy 1652057674546_1652057674546.pdf D:\bak\1652057674546_1652057674546.pdf
copy 1652057741740_1652057741741.pdf D:\bak\1652057741740_1652057741741.pdf
copy 1652057802243_1652057802243.pdf D:\bak\1652057802243_1652057802243.pdf
copy 1652057850762_1652057850762.pdf D:\bak\1652057850762_1652057850762.pdf
copy 1652057902542_1652057902542.pdf D:\bak\1652057902542_1652057902542.pdf
copy 1652061047669_1652061047669.pdf D:\bak\1652061047669_1652061047669.pdf

删除指定目录

1
2
3
4
5
// 删除一个空目录
rmdir download

// /s 删除一个非空目录,/q 不需要确认
rmdir /s/q temps

删除指定目录下模糊匹配的文件

1
del /F/S/Q "C:\Users\Administrator\AppData\Roaming\Scooter Software\Beyond Compare 4\BCState.*"

删除指定路径下 N 天前文件

https://blog.csdn.net/hzfw2008/article/details/77744304s

https://blog.csdn.net/m516387177/article/details/83025123?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

1
2
3
4
5
6
7
8
9
rem 90 天以前文件删除
set DaysAgo=90

rem 设置删除文件所在路径
set LogPath=C:\test\

rem /p指定搜索文件的路径 /s 在子目录中搜索 /m 指定格式,默认为*.* /d 选择日期(+大于 - 小于) /c 指定执行的命令 rem del /f 强制删除 /q 不询问是否删除 /a 按指定属性删除

forfiles /p %LogPath% /m *.dmp /d -%DaysAgo% /c "cmd /c del /q @FILE && echo @FILE && echo %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%" >> delete_old_backup.log

创建文件夹「如果不存在」

1
if not exist foldername (mkdir foldername)

拷贝文件夹「包含子文件夹」

1
2
3
4
set sourcefolder=C:\Tomcat8.0.53\webapps\xxx
set bakfolder=C:\Tomcat8.0.53\bak\%date:~0,4%%date:~5,2%%date:~8,2%\xxx
if not exist %bakfolder% (mkdir %bakfolder%)
xcopy %sourcefolder% %bakfolder% /e

关机

  • 关机

    1
    shutdown -f -s 
  • 重启

    1
    2
    3
    4
    shutdown -f -r

    // 推荐。其中,-r 表示重启,-f 表示强制关闭正在运行的程序,-t 0 表示立即重启
    shutdown.exe -r -f -t 0

进程「查看、杀死」

  • 查看所有进程

    1
    tasklist
  • 根据名称查看进程

    1
    tasklist | findstr java
  • 根据端口号查看进程

    1
    netstat -ano  | findstr 8080
  • 根据进程PID,杀死该进程

    1
    2
    # 强制(/F参数)杀死 pid 为 9088 的所有进程包括子进程(/T参数):
    taskkill /T /F /PID 9088
  • 根据指定端口号,杀死进程

    1
    2
    3
    4
    5
    6
    7
    8
    //根据端口,关闭进程
    @echo off
    set port=8080
    for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
    echo kill the process %%m who use the port %port%
    taskkill /pid %%m
    )
    pause
  • 脚本「输入端口号,杀死指定 PID 进程」

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set   /p  port="please input port:" 
    netstat -ano|findstr %port%
    set /p pid="please input pid:"
    taskkill /PID %pid% /F

    set /p port="please input port:"
    netstat -ano|findstr %port%
    set /p pid="please input pid:"
    taskkill /PID %pid% /F

根据端口杀死进程-批量脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off & setlocal EnableDelayedExpansion

title 杀死端口

for %%a in (6340,6330,1010,6301,6001) do (
set pid=0
for /f "tokens=2,5" %%b in ('netstat -ano ^| findstr ":%%a"') do (
set temp=%%b
for /f "usebackq delims=: tokens=1,2" %%i in (`set temp`) do (
if %%j==%%a (
taskkill /f /pid %%c
set pid=%%c
echo 端口号【%%a】相关进程以杀死
) else (
echo 不是本机占用端口【%%a】
)
)
)
if !pid!==0 (
echo 端口号【%%a】没有占用
)
)

echo 操作完成

pause

windows 中批量杀死 Nginx 进程

1
taskkill /fi "imagename eq nginx.exe" /f

任务计划

https://sites.google.com/site/yao27bat/home/basic/win7_schtasks

schtasks /?

创建任务

执行程序必须为绝对路径,示例c:\apps\myapp.bat

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
schtasks /create 
/tn TaskName :任务的名称

/tr TaskRun :任务运行的程序或命令,正确的路径和文件名

/sc schedule :有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE

[/mo modifier] :运行频率。这个参数对于 MONTHLY 计划是必需的。对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划,这个参数有效,但也可选。默认值为 1

[/d day] :指定周或月的一天。只与 WEEKLY 或 MONTHLY 计划共同使用时有效

[/m month[,month...] :指定一年中的一个月。有效值是 JAN ~ DEC 和 * (每个月)。/m 参数只对于 MONTHLY 计划有效。在使用 LASTDAY 修饰符时,这个参数是必需的。否则,它是可选的,默认值是 * (每个月)

[/i IdleTime] :指定任务启动之前计算机空闲多少分钟。键入一个 1 ~ 999 之间的整数。这个参数只对于 ONIDLE 计划有效,而且是必需的

[/st StartTime] :以 HH:MM:SS 24 小时格式指定时间。默认值是命令完成时的当前本地时间。/st 参数只对于 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 和 ONCE 计划有效。它只对于 ONCE 计划是必需的

[/sd StartDate] :以 MM/DD/YYYY 格式指定任务启动的日期。默认值是当前日期。/sd 参数对于所有的计划有效,但只对于 ONCE 计划是必需的

[/ed EndDate] :指定任务计划运行的最后日期。此参数是可选的。它对于 ONCE、ONSTART、ONLOGON 或 ONIDLE 计划无效。默认情况下,计划没有结束日期

[/s computer [/u [domain\]user/p password]] :
指定远程计算机的名称或 IP 地址(带有或者没有反斜杠)。默认值是本地计算机
使用特定用户帐户的权限运行命令。默认情况下,使用已登录到运行 SchTasks 的计算机上的用户的权限运行命令
指定在 /u 参数中指定的用户帐户的密码。如果使用 /u 参数,则需要该参数

[/ru {[Domain\]User | "System"}
使用指定用户帐户的权限运行任务。默认情况下,使用用户登录到运行 SchTasks 的计算机上的权限运行任务

[/rp Password]] /?
指定用户帐户的密码,该用户帐户在 /u 参数中指定。如果在指定用户帐户的时候忽略了这个参数,SchTasks.exe 会提示您输入密码而且不显示键入的文本。使用 NT Authority\System 帐户权限运行的任务不需要密码,SchTasks.exe 也不会提示索要密码。

范例

  1. 计划任务每 20 分钟运行一次

    1
    schtasks /create /sc minute /mo 20 /tn "Security Script" /tr \\central\data\scripts\sec.vbs
  2. 计划任务每天运行一次,在每天的 8:00 A.M. 运行一次,直到 2001 年 12 月 31 日结束

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc daily /st 08:00:00 /ed 12/31/2001
  3. 计划任务每隔一天运行一次,从 2001 年 12 月 31 日起每隔一天在 1:00 P.M. (13:00) 运行

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc daily /mo 2 /st 13:00:00 /sd 12/31/2001
  4. 计划任务每六周运行一次

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc weekly /mo 6 /s Server16 /ru Admin01
  5. 计划任务在每月的第一天运行,每月的第一天运行

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc monthly
  6. 计划任务在每月的最后一天运行

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc monthly /mo lastday /m *
  7. 计划任务在每次系统启动的时候运行,每次系统启动的时候运行,起始日期是 2001 年 3 月 15 日

    1
    schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc onstart /sd 03/15/2001

示例

每天每隔 5 分钟执行一次

image-20200822081722064

查看任务

1
schtasks /Query|findstr taskname

删除任务

1
schtasks /Delete /TN taskname

执行时如何隐藏 cmd 窗口

  • 最小化

    1
    2
    # /min 最小化
    start /min D:\xxx\start.bat

窗口控制

1
2
3
4
cmd /c dir 是执行完dir命令后关闭命令窗口.
cmd /k dir 是执行完dir命令后不关闭命令窗口.
cmd /c start dir 会打开一个新窗口后执行dir指令, 原窗口会关闭.
cmd /k start dir 会打开一个新窗口后执行dir指令, 原窗口不会关闭.

应用程序

一个应用可能存在多个进程

查看正在运行的程序

1
tasklist|findstr chrome

杀死指定程序

1
taskkill /f /im chrome.exe

根据 pid 杀死进程,有时候一个应用有多个 pid 进程,则需要执行多次

环境变量

  1. 查看所有环境变量

    set 命令使用简介https://blog.csdn.net/livelylittlefish/article/details/6093836

    1
    set
  2. 查看指定环境变量

    1
    2
    3
    4
    5
    set 变量名

    示例
    C:\Users\Administrator>set JAVA_HOME
    JAVA_HOME=D:\Program Files\Java\jdk1.8.0_191
  3. 设置环境变量

    1
    2
    3
    4
    set 变量名=变量值

    示例
    set oracle_sid=orcl

用户

获取本机全部用户

1
2
3
4
5
6
7
8
@echo off
echo 本机上拥有以下用户:
echo.
for /f "skip=4 tokens=1-3" %%i in ('net user') do (
if not "%%i"=="命令成功完成。" echo %%i
if not "%%j"=="" echo %%j
if not "%%k"=="" echo %%k
)

当前用户

1
echo 当前登录本机的账户是:%username%

日期和时间

日期

1
2
3
echo %date%

2020/05/20 周三

时间

1
2
3
echo %time%

19:27:29.36

日期+时间

1
2
echo %date%%time%
2020/05/20 周三19:25:57.93

日期+时间「yyyymmddhhmmss」

1
2
3
echo %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%

20200520192815