标题: [ 新手练习题 7 ] 更改文件的“系统、隐藏”属性的批处理 [打印本页]
作者: wxcute 时间: 2009-7-1 19:25 标题: [ 新手练习题 7 ] 更改文件的“系统、隐藏”属性的批处理
[ 新手练习题 7 ] 更改文件的“系统、隐藏”属性
检查某文件/目录是否含有“系统、隐藏”两个属性,只要有一个没有则添加这两个属性,两个都有则清除此二属性。
两个属性同时操作,文件/目录的其他属性不变。
示例文件:"%HOMEDRIVE%\BOOT.INI",当然最好是自行创建一文件。
目的:掌握文件/目录的属性查看与更改方法。
要求:只要求操作一个文件或目录。
方法不限。
参考:ATTRIB /?
评分:代码可读性 1 分;
首个新方法 5 分,第二个 4 分,依次类推,最少 2 分;
一人可多种方法,新方法追加 2 分,已经出现过的方法追加 1 分。
2009-07-02 主要描述修改。
改前:检查某文件/目录的是否含有“系统、隐藏”属性,若没有则添加这两个属性,有则清除。
改后:检查某文件/目录是否含有“系统、隐藏”两个属性,只要有一个没有则添加这两个属性,两个都有则清除此二属性。
两个属性同时操作,文件/目录的其他属性不变。
作者: zljzsmzzx 时间: 2009-7-2 15:48
- @echo off
- for %%i in (a.txt) do set x=%%~ai
- echo,%x%|findstr /i "h">nul 2>nul&&attrib -h a.txt||attrib +h a.txt
- echo,%x%|findstr /i "s">nul 2>nul&&attrib -s a.txt||attrib +s a.txt
复制代码
我在自己的机子上试了。不知道是我系统的问题还是怎样。好像+h和+s两个不能同时存在。不知道你们有没有碰到这样的情况。
作者: zljzsmzzx 时间: 2009-7-2 19:01
新答案:- @echo off
- for %%i in (a.txt) do set "x=%%~ai"&set "file=%%i"
- if /i "%x:~3,1%" equ "h" (
- if /i "%x:~4,1%" equ "s" (
- attrib -h -s "%file%"
- ) else attrib +h +s "%file%"
- ) else attrib +h +s "%file%"
复制代码
作者: zljzsmzzx 时间: 2009-7-3 12:26
下面这个是用的方法是读取参数的属性。代码精心设计了一下,更具人性化。- @echo off&setlocal enabledelayedexpansion&cls
- if "%~1" == "" (
- echo=请把要设置属性的文件或文件夹拖到该窗口。(手动输入也是可以的。)
- set "file="&set /p file=文件或文件夹完整路径=
- if "!file!" == "" (endlocal&%~s0&exit)
- if not exist "!file!" (cls&echo=文件或文件夹[!file!]不存在。请重新输入。&pause&endlocal&%~s0&exit)
- call :file !file!
- if /i "!x:~3,1!" equ "h" (
- if /i "!x:~4,1!" equ "s" (
- attrib -h -s "!file!"
- ) else attrib +h +s "!file!"
- ) else attrib +h +s "!file!"
- ) else (
- set "x=%~a1"
- set "file=%~1"
- if /i "!x:~3,1!" equ "h" (
- if /i "!x:~4,1!" equ "s" (
- attrib -h -s "!file!"
- ) else attrib +h +s "!file!"
- ) else attrib +h +s "!file!"
- )
- exit
- :file
- set "x=%~a1"
- set "file=%~1"
- goto :EOF
复制代码
两种运行方式:
1.双击运行批处理。然后把要设置属性的文件或文件夹拖到cmd.exe窗口上放开再回车。
2.直接把要设置属性的文件或文件夹拖到批处理上放开就可以了。
另外还想请问一下。除了用参数的%~a1和for的%%~ai这种方法还有没有其它办法获得文件的属性?比如读取文件属性的命令。
作者: wxcute 时间: 2009-7-3 12:45 标题: 回复 4楼 的帖子
说到其他方法,应该还是有的。
直接用命令读取属性没办法赋值,但配合FOR处理一下得到的属性就能了。
开动脑筋,可能还会有新方法呢。
作者: liaobiaoxing 时间: 2009-7-3 22:30
- @echo off
- color 1f
- title 更改文件的“系统、隐藏”属性
- set /p file=请输入文件或目录的绝对路径:
- attrib %file%>>1.tmp
- for /f "tokens=1 delims=&" %%i in (1.tmp) do set tmp="%%i"&del 1.tmp
- if %tmp:~4,2%== H (attrib %file% -h&attrib %file% +h +s&echo:已经为该文件添加系统属性!)
- if %tmp:~4,2%==S (attrib %file% -s&attrib %file% +h +s&echo:已经为该文件添加隐藏属性!)
- if %tmp:~4,2%==SH (attrib %file% -h -s&echo:已经去掉了该文件的隐藏和系统属性!)
- pause>nul
复制代码
4楼的代码看得眼花...我初学批处理,只能这个样子了.如果将代码第5行的attrib %file%>>1.tmp 改成attrib /s %file%>>1.tmp 的话,如果你输入的是文件则无区别,如果输入的是路径的话则会枚举该目录下所有文件的属性并按照要求修改。
[ 本帖最后由 liaobiaoxing 于 2009-7-3 22:50 编辑 ]
作者: zljzsmzzx 时间: 2009-7-4 00:16 标题: 回复 6楼 的帖子
4楼的代码看着眼花??是没看懂吧?“层次分明”得很啊。给你个建议,以后像写if %tmp:~4,2%== H这样的字符比较最好等号两边都用双引号“关闭”,如if "%tmp:~4,2%" == " H"。不然到时候出错了还不知道是怎么回事。另外照你那样的判断方法好像还少了一种情况吧?if "%tmp:~4,2%" == " "两种属性都没有的情况。还有,%tmp:~4,2%应该是%tmp:~3,2%吧?“delims=&”中的&哪来的?真不知道你代码写好后试过没。
原来attrib自己就可以查看文件的属性啊,一直都忽视了呢,惭愧惭愧!- @echo off&setlocal enabledelayedexpansion&cls
- if "%~1" == "" (
- echo=请把要设置属性的文件或文件夹拖到该窗口。(手动输入也是可以的。)
- set "ph="&set /p ph=文件或文件夹完整路径=
- if "!ph!" == "" (endlocal&%~s0&exit)
- if not exist "!ph!" (cls&echo=文件或文件夹[!ph!]不存在。请重新输入。&pause&endlocal&%~s0&exit)
- for /f "delims=" %%i in ('attrib !ph!') do (set "x=%%i")
- if /i "!x:~4,1!" equ "h" (
- if /i "!x:~3,1!" equ "s" (
- attrib -h -s "!ph:"=!"
- ) else attrib +h +s "!ph:"=!"
- ) else attrib +h +s "!ph:"=!"
- ) else (
- set "x=%~a1"
- set "ph=%~1"
- if /i "!x:~3,1!" equ "h" (
- if /i "!x:~4,1!" equ "s" (
- attrib -h -s "!ph!"
- ) else attrib +h +s "!ph!"
- ) else attrib +h +s "!ph!"
- )
复制代码
也是两种运行方式,同4楼。
[ 本帖最后由 zljzsmzzx 于 2009-7-4 00:27 编辑 ]
作者: liaobiaoxing 时间: 2009-7-4 17:18
我初学的批处理,对于代码确实比较头疼。但是对于系统工具有一定的认识。代码我肯定是试过的,没有任何问题,至于要求,我是按照楼主的,再加个情况也很简单。delims=&这个&是随意用的,因为我记错了。以为&是不可能存在于文件名中的,现在看来应该改成?或其它不能包含的比较合适,使用delims这个参数主要是把ATTRIB输出的属性和文件路径赋给tmp。因为不加delims这个参数的话,比如ATTRIB输出的格式:“A H C:\Documents and Settings\XXX\NTUSER.DAT”把这个直接赋给tmp的话,那么tmp将只会是A,因为系统默认空格为分隔符,所以我把delims参数设置成为&就可以把整个一串的值赋给tmp。而使用%tmp:~4,2%来判断HS属性。
[ 本帖最后由 liaobiaoxing 于 2009-7-4 17:20 编辑 ]
作者: wxcute 时间: 2009-7-4 18:42 标题: 回复 7楼 zljzsmzzx 的帖子
IF语句完全可以精简成两句,甚至只有一句。
回复 8楼 liaobiaoxing 的帖子
用ATTRIB命令读取属性,除了用delims,还可用变量截取的方法取得属性。
作者: zljzsmzzx 时间: 2009-7-4 19:19 标题: 回复 8楼 的帖子
用“delims="表示不用分隔符。
作者: liaobiaoxing 时间: 2009-7-4 20:14
- @echo off
- color 1f
- title 更改文件的“系统、隐藏”属性
- set /p file=请输入文件或目录的绝对路径:
- attrib %file%>>1.tmp
- for /f "tokens=1 delims=" %%i in (1.tmp) do set tmp="%%i"&del 1.tmp
- if "%tmp:~4,2%"==" H" (attrib %file% -h&attrib %file% +h +s&echo:已经为该文件添加系统属性!)
- if "%tmp:~4,2%"=="S " (attrib %file% -s&attrib %file% +h +s&echo:已经为该文件添加隐藏属性!)
- if "%tmp:~4,2%"=="SH" (attrib %file% -h -s&echo:已经去掉了该文件的隐藏和系统属性!)
- if "%tmp:~4,2%"==" " (attrib %file% +h +s&echo:已经给文件加上隐藏和系统属性!)
- pause>nul
复制代码
多谢。。现在改正~刚学批处理确实有太多地方要注意。
作者: 风行者 时间: 2009-7-12 23:36 标题: 不用for,用for还是%%~ai好点
- @echo off
- attrib a.txt | findstr /r "\<SH\>" && set vsh=sh
- attrib a.txt | findstr /r "\S\>" && set vs=s
- attrib a.txt | findstr /r "\H\>" && set vh=h
- if defined vs (attrib +s +h a.txt) else (
- if defined vh (attrib +s +h a.txt) else (
- if defined vsh (attrib -s -h a.txt) else attrib +s +h a.txt))
复制代码
好像简单变复杂了
[ 本帖最后由 风行者 于 2009-7-13 12:21 编辑 ]
作者: dalidali 时间: 2009-10-23 13:32 标题: 回复 1楼 的帖子
我来写个简单点的,刚学,自认为很简单,拖放刚是单一文件修改,运行则是修改当前文件下所有文件
命令如下:
@echo off
attrib %1 | find /i "sh" && attrib -s -h %1 || attrib %1 | find /i "sh" || attrib +s +h %1
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |