Board logo

标题: [文件操作] 【已处理】批处理怎么判断文件是否是只读的 [打印本页]

作者: 回家路上    时间: 2015-7-10 21:25     标题: 【已处理】批处理怎么判断文件是否是只读的

本帖最后由 回家路上 于 2015-7-10 23:28 编辑

需求:
1)对文件夹下子文件进行遍历
2)找出所有的abc.xml(举例)文件
3)如果文件只读改为不是只读,【并记录】
4)对文件操作(测试的话,输出文件名代替罢了)
5)将所以修改只读属性的文件恢复。

可是判断文件是否只读没有头绪,求教。
作者: CrLf    时间: 2015-7-10 21:59

最直接的是这样:
  1. dir /ar /s abc.xml
复制代码
当然你也可以这样:
  1. attrib /s abc.xml | findstr "^.....R"
复制代码
或者用这样(看不懂就算了,这是来炫技巧的...):
  1. for /r %%a in (abc.xml) do (
  2.    for /f "tokens=2 delims=r" %%b in ("%%~aa") do echo %%a
  3. )
复制代码

作者: 回家路上    时间: 2015-7-10 22:24

回复 2# CrLf


嘿,谢谢。

我在cmd窗口执行 attrib abc.xml
会把abc.xml文件的全路径也显示。这个在匹配的时候其实是不算的吗?
  1. A    R       D:\Code\Batch\abc.xml
复制代码
就是说如果文件名或者文件路径中有“R”是不会匹配的吗?
作者: 回家路上    时间: 2015-7-10 22:42

本帖最后由 回家路上 于 2015-7-10 22:43 编辑

回复 2# CrLf

哦,指定了,前面只有五个字符。谢啦。
赞一个
然后我在使用的时候
  1. for /r %%a in (abc.xml) do (
  2. attrib %%a | findstr "^.....R" >nul&& do something
  3. attrib %%a | findstr "^.....R" >nul|| do something
  4. )
复制代码
这样好不?
作者: CrLf    时间: 2015-7-11 01:46

回复 4# 回家路上


    用 dir /ar /s /b abc.xml 更好呀
作者: 回家路上    时间: 2015-7-11 11:00

本帖最后由 回家路上 于 2015-7-11 11:05 编辑

回复 5# CrLf


嗯,这个dir可以直接找出只读的所有文件
而我是想对所有pom.xml文件进行操作,无论是否只读。
所以没有选择dir,而是两方面进行判定。
可是有出现了新的问题——utf-8的文件读取怎么不正确啊。
pom.xml————utl-8格式的
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>cn.snsoft.ftc</groupId>
  5. <artifactId>SNS-ftc_tomcat</artifactId>
  6. <name>SNS-ftc_tomcat</name>
  7. <version>1.0.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <dependencies>
  10. <!-- 依赖 -->
  11. <dependency>
  12. <groupId>cn.com.test</groupId>
  13. <artifactId>TestUtil</artifactId>
  14. <version>1.0.0</version>
  15. <type>jar</type>
  16. </dependency>
  17. </project>
复制代码
我在读取的时候,想输出到一个新的文件里,发现是乱码,
然后改为控制台直接输出就是i乱码的。怎么解?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*pom.xml) do (
  3. attrib %%a | findstr "^.....R">nul && set staus=1
  4. if "!staus!"=="1" (call :replace %%a readonly) else call :replace %%a
  5. set staus=0
  6. )
  7. pause & exit /b
  8. :replace
  9. if not "%2"=="" (
  10. attrib -R %1 & echo 去除只读
  11. call :deal %1
  12. attrib +R %1 & echo 恢复只读
  13. ) else (
  14. echo 文件不是只读,直接操作
  15. call :deal %1
  16. )
  17. goto :eof
  18. :deal
  19. echo 操作%~dp1%~nx1文件
  20. for /f "delims=" %%c in (%1) do (
  21. echo %%c
  22. )
  23. ::>>%~dp1pom_bak.xml
  24. goto :eof
复制代码
其实简单就是说,我想把一个utf-8的文本文件修改其中一个字符串(无论是否只读),然后其他都不变(该恢复的都恢复)。
然后只是这样读取的话乱码,该怎么办?求教
  1. for /f "delims=" %%c in (pom.xml) do (
  2.     echo %%c
  3. )
复制代码

作者: 回家路上    时间: 2015-7-11 14:09

本帖最后由 回家路上 于 2015-7-11 14:27 编辑

回复 5# CrLf


或者处理单个的时候引用VB、JS都行。我这还有的整没
论坛里另一个帖子http://www.bathome.net/thread-33057-1-1.html
找了一个例子,但是不知道怎么往我这里面加了。貌似,cscript命令不能放在bat标签里
  1. @if (0)==(0) echo off
  2. set "htmlfile=pom.xml"
  3. cscript -nologo -e:jscript "%~0" "%htmlfile%"
  4. pause
  5. goto :EOF
  6. @end
  7. arg = WScript.Arguments;
  8. with (new ActiveXObject("ADODB.Stream")){
  9.         Mode = 3;
  10.         Type = 2;
  11.         Charset = "utf-8";
  12.         Open();
  13.         LoadFromFile(arg(0));
  14.         s = ReadText(-1);
  15.         s = s.replace(/1\.0\.0-SNAPSHOT/ig, '2.0.0-SNAPSHOT');
  16.         Position = 0;
  17.         WriteText(s);
  18.         SetEOS;
  19.         SaveToFile(arg(0), 2)
  20. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2