下面是按照批处理脚本的教程写的几个关于文件,文件夹管理的脚本,都是运行通过的。每个脚本下面是运行过程中解决问题后觉得要注意的地方。
转载请注明出处:博客园--邦邦酱好
1. 批量更改文件名
@echo off echo 开始更改文件名 set altername=test set /a sum=0 for %%m in (*.txt) do ( if not "%%m"=="test.bat" ( echo %%m ren %%m %altername%%%m set /a sum=sum+1 ) ) echo 一共有%sum%个文件被改名 set sum= set altername=
注意:do和if语句的条件要和其后的“(”之间空一格而且必须在同一行,否则容易出现语法错误。
2. 创建编号从0-99的100个文件
@echo off echo 开始创建0-99共100个文件 echo. echo. for %%n in (0,1,99) do ( echo 文件%%n >> 文件%%n.txt ) echo 创建完毕
3. 自动循环运行某个程序
@echo off echo “正在测试是否可ping通主机127.0.0.1” :again ping 127.0.0.1 > nul if NOT %errorlevel% == 0 ( goto again) start "可正常ping通" echo 可正常ping通
注意:if语句判断后的command 必须有一部分(半括号也算)与条件在同一行,否则会出现语法命令不正确。
也可直接在同一行写完:if NOT %errorlevel% == 0 goto again
4. 显示批处理的完整路径信息
@echo off echo 当前运行的%0文件的完整路径为: echo %~dp0 echo.
注意:%0表示批处理文件名本身,~dp组合代表将指定的变量扩展到路径
5. 将文件名自动更名为当前系统日期
@echo off if not exist %1 ( echo ss: echo %0 filename echo filename:表示需要修改的文件名。 echo. echo. goto end ) set extension=%~x1 for /F "tokens=1,2,3 delims=/- delims=/ " %%A in ('date /T') do ( set date=%%A%%B%%C ) ren %1 "%date%%extension%" echo. echo successed! set extension= set date= :end
注意:
1. if后的(要跟command之间空一格,否则会出错。
2. 这里的for语句,/F表示用文件解析过程处理。tokens用于定义for中变量的个数,delims用于定于字符串的分隔符。date /T 必须用单引号,否则会出错,它返回当前日期字符串如“2014-10-11 星期四”,所以要使用-和空格分割它。
3.这里的for 条件 do 和后面的command 要不在同一行,要不就空格后紧跟(再分行。否则会出错。
4. ren 改名前 改名后 这里的改名后是由2个变量引用所得,必须用双引号括起,否则会出现命令语法不正确的错误。
6. 使用批处理命令自动接收用户输入的信息
@echo off :repeat echo. echo. echo *************请选择你想要执行的操作************* echo -------1.输入数字1并按回车键,则显示当前日期----- echo -------2.输入数字2并按回车键,则显示当前时间----- echo -------3.输入数字3并按回车键,则显示文件列表----- echo -------4.输入其他任意字符并按回车键,则终止批处理----- echo. echo 请输入: set /p reply= if “%reply%”==“1” ( echo 当前日期是: date /t pause goto repeat ) if “%reply%”==“2” ( echo 当前时间是: time /t pause goto repeat ) if “%reply%”==“3” ( echo 显示文件列表: dir /w pause goto repeat ) echo. echo 你输入了%reply%字符,批处理程序自动退出 pause
注意:
1. 接收屏幕输入的语法:set /p reply= 记得要写=
2. 判断时要先%变量%引用变量,再用双引号当做字符来进行判断
7. 为批处理所在的文件夹自定义图标
@echo off if not exist shell32.dll ( echo 图标文件不存在,无法完成任务 goto end ) rem desktop.ini是系统可识别的一个文件,作用是存储用户对文件夹的个性设置。 if exist desktop.ini ( rem 要先把desktop.ini设置为非隐藏(-h),才能进行删除 attrib desktop.ini -h -s -a -r del desktop.ini /a /f /q ) rem 下面对desktop.ini文件进行设置。 echo [.ShellClassInfo] >desktop.ini echo IconFile=shell32.dll >>desktop.ini echo IconIndex=2 >>desktop.ini rem 隐藏desktop.ini和图标文件,避免误删 attrib desktop.ini +h +s +r attrib tubiao.ico +h +s +r echo. echo 成功将当前文件夹的图标更改为tubiao.ico :end
注意:
1. 开始我是用自己创建的图片(myself.ico)但是发现一直不成功。于是我右键文件夹,选择属性-自定义-文件夹图标,尝试使用我自己创建的图片更改图标,系统提示:它不包含图标。
然后我发现系统用的图标是"C:\Windows\System32\shell32.dll",于是我就将它拷贝到批处理文件所在的文件夹使用了。当然,直接引用它的路径也是可以的。
2. 在cmd.exe下执行该批处理文件后,需要等待一段时间才能看到批处理文件所在的文件夹图标被改变了。(开始我一直以为不成功,后来去看结果图标是改变了的,只是有延迟)
8. 建立具有保护性的文件夹
@echo off echo. echo 利用word文档及midi文档对应的classid创建文件夹 md a.doc.{00020906-0000-0000-C000-000000000046} md a.mid.{00022603-0000-0000-C000-000000000046} echo. echo 已经成功创建2个文件夹 echo.
注意:
是创建了a.doc和a.mid这两个文件夹,但是双击后还是可以打开啊(教程的结果是:双击它们,并非直接打开文件夹,需要右键并选择“打开”选项才能打开),我暂时没有找到原因。
9. 利用批处理程序为指定文件创建快捷方式
@echo off if not exist %1 ( echo 该批处理正确用法如下: echo %0 filename echo 参数filename表示要创建快捷方式的文件 echo. echo 批处理无法创建快捷方式,因为没有指定文件 goto end ) echo 正在为指定的文件创建快捷方式... rem ~n表示取文件名 set shortcutname=%~n1.url rem 将[InternetShortcut]写入文件,表示该文件是一个快捷方式文件 echo [InternetShortcut] > %shortcutname% rem ~f表示取文件全称 echo URL=%~f1 >> %shortcutname% echo IconIndex=1 >> %shortcutname% rem %windir%表示系统安装目录,它是系统默认的环境变量 echo IconFile=%windir%\system32\shell32.dll >> %shortcutname% rem >nul表示将copy命令产生的信息发送到空设备,从而避免直接显示在命令行窗口 copy %shortcutname% "D:\" > nul echo. echo 成功创建%1 的快捷方式%shortcutname%,该快捷方式已经发送到桌面! set shortcutname= echo. :end
注意:
如果出现批处理copy被访问拒绝:
1. 方法一:在cmd下输入:icacls C: /grant accountname:perm
其中perm是权限掩码,大概是F(完全访问权限),M(修改权限),RX(读取和执行),R(只读),W(只写)。
但是输入icacls C: /grant accountname:f后,如果把copy快捷方式到C盘,还是会拒绝访问,但可以copy到D盘。具体什么原因还是搞不清。
2. 方法二:切换系统账户到administrator或者使用管理员权限运行cmd,再执行脚本,这样什么权限都有了。
10. 直接进入指定文件夹的命令行窗口
@echo off echo Windows Registry Editor Version 5.00 >temp.reg echo 正在添加命令到文件夹快捷菜单.. rem [HKEY_CLASSES_ROOT\Directory\shell\runas]是regedit注册表的某个位置 rem 若runas文件夹不存在即创建它,否则覆盖它 echo [HKEY_CLASSES_ROOT\Directory\shell\runas] >>temp.reg rem 选中文件夹后,按下shift在文件夹右击就会出现“在CMD窗口打开文件夹”这样的快捷菜单。 rem &符号后面的字符作为快捷键,即弹出快捷菜单后按下ctrl+c即可执行该命令(不过可能会跟windows系统原有的快捷键相冲突) echo @="在&CMD窗口打开文件夹" >>temp.reg echo [HKEY_CLASSES_ROOT\Directory\shell\runas\command] >>temp.reg rem pushd作用:保存当前目录以供 POPD 命令使用,然后改到指定的目录 rem %号写入文件,需要使用%来转义它,否则写入失败(其他符合如"还是使用\来进行转义) %1是cd命令的第一个参数-路径 echo @="cmd.exe /s /k \"cd %%1\"" >>temp.reg rem 也可以这样写:echo @="cmd.exe /s /k pushd \"%%V\"" >>temp.reg echo 成功添加命令行窗口打开文件夹命令! echo. regedit /s temp.reg del /q /f temp.reg >nul
注意:
这个脚本纠结了很久才执行成功。
1. 是%号的转义,查了很久才发现是用%号转义,而不是\;
2. 注册表文件的写入,由于当前的系统账户不是管理员,有时候会写入注册表失败。
3. 教程中打开文件夹是这样写的:@=“cmd /k "cd %~pd1"”,我一直执行失败,百度过后才发现直接cd %1就可以了,不需要~pd,因为%1就是代表cd命令的第一个参数-路径!
11.批处理程序中不同盘符路径的切换
@echo off echo. echo 从当前盘符C:\切换到另一个盘符D:\目录下: pushd d:\ echo d:\目录中包含以下文件夹: rem /ad表示只显示文件夹,/b表示以简洁方式显示文件夹,不显示标题信息与摘要 dir /ad /b echo. echo 返回批处理运行时所在的目录 popd
注意:
1. pushd和popd是成对使用的。
2. pushd命令执行时将当前路径保存到栈并切换到命令中指定的路径。而popd命令是将栈中的路径取出来并将当前路径设置为该路径。