[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批量修改文件夹下的desktop.ini

最近深刻的研究了一下每个文件夹下的desktop.ini配置文件
依据该文件可以修改文件夹的诸多信息
奈何本人对bat批处理研究不深刻
劳烦大佬们帮忙
现有A.txt文件中存有文本
实例1
实例2
现在需要根据A.TXT进行批量写入(目标目录下的每一个文件夹中的desktop.ini)
目录为:D:\
该磁盘中有1和2两个文件夹
需要达到目标:每个文件夹中都有desktop.ini且包含以下内容
[.ShellClassInfo]
LocalizedResourceName=%%b(变量来自于A.txt)
例如:D:\1\desktop.ini中为:
[.ShellClassInfo]
LocalizedResourceName=实例1
感谢各位大佬帮忙!
希望你真诚善良

想过诸多解决办法,有嵌套for循环的,
但是最后结果达到把实例1实例2都给写进去了我也不知道循环错在哪里了没停下来
希望你真诚善良

TOP

本帖最后由 wujunkai 于 2020-3-18 10:16 编辑

回复 1# SGTeam
  1. @echo off
  2. @setlocal enabledelayedexpansion
  3. :main
  4.     (call:get_folder)>folder.txt
  5.     call:fopen folder.txt name
  6.     call:fopen A.txt info
  7.     call:shell
  8. pause
  9. goto:eof
  10. :get_folder
  11.     for /F %%i in ('dir /B D:\') do if exist D:\%%i\* echo %%i
  12. goto:eof
  13. :fopen
  14.     rem %~1 为读取文件名,%~2为储存的变量名
  15.     rem 若无%~2,使用%~n1作为储存的变量名
  16.     set fopen_file=%~1
  17.     if "%~2"=="" (
  18.         set fopen_vale=%~n1
  19.     ) else (
  20.         set fopen_vale=%~2
  21.     )
  22.     set fopen_len=0
  23.     for /F "tokens=*" %%i in (%~1) do (
  24.         set %fopen_vale%[!fopen_len!]=%%i
  25.         set /A fopen_len+=1
  26.     )
  27. goto:eof
  28. :shell
  29.     set /A len=%fopen_len%-1
  30.     for /L %%i in (0,1,%len%) do (
  31.         echo [.ShellClassInfo]>D:\!name[%%i]!\desktop.ini
  32.         echo LocalizedResourceName=!info[%%i]!>>D:\!name[%%i]!\desktop.ini
  33.     )
  34. goto:eof
复制代码
正常的思路应该是这样的,folder.txt自己删掉。
没事就不要嵌套循环了,bat对多行语句的支持不是很好

TOP

哇!!!太感谢了!!!!!
希望你真诚善良

TOP

回复 3# wujunkai


    您好!可以劳烦您稍加解释一下他是如何运作的吗?后面的我可以看得懂,前面的A.txt部分我有一点点懵
希望你真诚善良

TOP

还有一点哦,我执行了之后,1文件夹下出现了实例2
希望你真诚善良

TOP

出现拒绝访问,然后这个我百度一下如何解决吧,就是劳烦您,我的实际A.txt中会有很多的文本需要写入到很多文件夹,这个批处理程序会生效吗?
希望你真诚善良

TOP

回复 5# SGTeam
  1. @echo off
  2. @setlocal enabledelayedexpansion
  3. :main
  4.     rem 主函数。。。。
  5.     (call:get_folder)>folder.txt
  6.     call:fopen folder.txt name
  7.     call:fopen A.txt info
  8.     rem call:shell
  9. pause
  10. goto:eof
  11. :get_folder
  12.     rem 获取D:\下的文件夹 , 我觉得问题应该出现在这里
  13.     for /F %%i in ('dir /B D:\') do if exist D:\%%i\* echo %%i
  14. goto:eof
  15. :fopen
  16.     rem 读取文件
  17.     rem %~1 为读取文件名,%~2为储存的变量名
  18.     rem 若无%~2,使用%~n1作为储存的变量名
  19.     set fopen_file=%~1
  20.     if "%~2"=="" (
  21.         set fopen_vale=%~n1
  22.     ) else (
  23.         set fopen_vale=%~2
  24.     )
  25.     set fopen_len=0
  26.     for /F "tokens=*" %%i in (%~1) do (
  27.         set %fopen_vale%[!fopen_len!]=%%i
  28.         echo %fopen_vale%[!fopen_len!]=%%i
  29.         set /A fopen_len+=1
  30.     )
  31. goto:eof
  32. :shell
  33.     rem 循环进行ini的写入
  34.     set /A len=%fopen_len%-1
  35.     for /L %%i in (0,1,%len%) do (
  36.         echo [.ShellClassInfo]>D:\!name[%%i]!\desktop.ini
  37.         echo LocalizedResourceName=!info[%%i]!>>D:\!name[%%i]!\desktop.ini
  38.     )
  39. goto:eof
复制代码
把显示的内容发一下,我看看问题到底是什么

TOP

:fopen
    rem %~1 为读取文件名,%~2为储存的变量名
    rem 若无%~2,使用%~n1作为储存的变量名
    set fopen_file=%~1
    if "%~2"=="" (
        set fopen_vale=%~n1
    ) else (
        set fopen_vale=%~2
    )
    set fopen_len=0
    for /F "tokens=*" %%i in (%~1) do (
        set %fopen_vale%[!fopen_len!]=%%i
        set /A fopen_len+=1
    )
谢谢您!这部分的可以劳烦您稍微解释一下吗,前面的folder我看懂了是列出了D:\下的文件夹的名称
希望你真诚善良

TOP

  1. :fopen
  2.     rem %~1 为读取文件名,%~2为储存的变量名
  3.     rem 若无%~2,使用%~n1作为储存的变量名
  4.     set fopen_file=%~1
  5.     if "%~2"=="" (
  6.         set fopen_vale=%~n1
  7.     ) else (
  8.         set fopen_vale=%~2
  9.     )
  10.     set fopen_len=0
  11.     rem 以上全部都是定义变量
  12.     rem 以下是for /F 进行文件读入
  13.     rem 实在看不懂建议去自己搜索一下for /F
  14.     rem "tokens=*“是为了读入一行中的全部字符,不会被分割掉
  15.     for /F "tokens=*" %%i in (%~1) do (
  16.         set %fopen_vale%[!fopen_len!]=%%i
  17.         set /A fopen_len+=1
  18.     )
  19. goto:eof
复制代码
整个是一个封装好的函数,很久写的,应该是没什么bug,也用过很多次了。
现在在上网课,不能实时回复,抱歉

TOP

返回列表