无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 3776|回复: 47
打印 上一主题 下一主题

[求助] 批处理又出问题了,各种百度、测试都不行,无奈求助.1000无忧币

  [复制链接]
跳转到指定楼层
#
发表于 2024-2-22 15:17:51 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1000无忧币
本帖最后由 likeyouli 于 2024-2-22 15:20 编辑

如题,问题:下段代码即不报错,什么也不输出,不知道哪里出了问题?  图片有解释..不用延迟变量,只能输出一个分区的文件,所以还必须得用延迟变量。
@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m) do if exist %%w: echo %%w:\>>pan.txt
setlocal enabledelayedexpansion
for /f %%s in (pan.txt) do (
set tt=%%s
for /r [!tt!] %%i in (*.txt *.exe) do echo %%~i
)
endlocal


11.png (69.48 KB, 下载次数: 38)

11.png
42#
发表于 4 天前 | 只看该作者
THANKS YOU VERY MUCH
回复

使用道具 举报

41#
发表于 7 天前 来自手机 | 只看该作者
谢谢分享,支持原创,楼主不易,了表赞赏。
回复

使用道具 举报

40#
发表于 2024-5-6 22:45:27 来自手机 | 只看该作者
不懂啊,来看看
回复

使用道具 举报

39#
发表于 2024-5-6 14:40:24 | 只看该作者
进来学习
回复

使用道具 举报

38#
发表于 2024-4-18 08:19:50 | 只看该作者
本帖最后由 xs888 于 2024-4-18 08:23 编辑

变量赋值:确认变量 tt 在使用延迟变量之前已经正确地被赋值了。
路径格式:检查 !tt! 中的路径格式是否正确,确保没有任何错误或不规范的字符。
文件权限:确保你有足够的权限访问和处理相关文件和目录。
特殊字符:检查路径中是否包含特殊字符,可能需要进行转义或处理。
代码逻辑:仔细检查代码的逻辑,确保没有其他潜在的问题或错误。
如果问题仍然存在,你可以尝试以下方法:
添加一些调试输出,以便在执行过程中查看变量的值和流程状态。
将代码分解为更小的部分,并逐步测试每个部分,以确定问题出在哪里。
尝试在不同的环境或计算机上运行代码,看看是否有不同的结果。@echo offfor %%w in (c,d,e,f,g,h,i,j,k,l,m,z) do (  if exist %%w: (    for /r %%i in (*.zip) do echo %%~i>>pan.txt  ))pause
回复

使用道具 举报

37#
 楼主| 发表于 2024-3-26 17:14:08 | 只看该作者
本帖最后由 likeyouli 于 2024-3-26 22:14 编辑
szwp 发表于 2024-3-26 16:27
dir /?
-  表示“否”的前缀

刚又测试了一下,dir /a- 也可以用,dir /a- :是不是表示显示所有的文件和文件夹,包括D、R、H、A等全部属性的文件和文件夹? 貌似也可以用dir /a , 难道dir /a与dir /a- 是等价的 ?
回复

使用道具 举报

36#
 楼主| 发表于 2024-3-26 16:55:12 | 只看该作者
szwp 发表于 2024-3-26 16:27
dir /?
-  表示“否”的前缀

感谢大师,,
/A          显示具有指定属性的文件。
   D  目录                R  只读文件
  H  隐藏文件            A  准备存档的文件
  S  系统文件            I  无内容索引文件
  L  重新分析点          O  脱机文件
-  表示“否”的前缀
也就是说 dir /a-d 表示:除了目录不显示,其余都显示。
回复

使用道具 举报

35#
发表于 2024-3-26 16:27:59 | 只看该作者
dir /?
-  表示“否”的前缀

点评

刚又测试了一下,dir /a- 也可以用,dir /a- :是不是表示显示所有的文件和文件夹,包括D、R、H、A等全部属性的文件和文件夹?  详情 回复 发表于 2024-3-26 17:14
感谢大师,, 也就是说 dir /a-d 表示:除了目录不显示,其余都显示。  详情 回复 发表于 2024-3-26 16:55
回复

使用道具 举报

34#
 楼主| 发表于 2024-3-26 15:49:32 | 只看该作者

dir命令竟然可以这样写:
dir /r /b /s /a-d c:\*.txt c:\*.jpg    --学习到了,感谢!
  /r 显示文件的备用数据流;
/b 使用空格式(没有标题信息或摘要);
/s 显示指定目录和所有子目录中的文件
/a-d 这个代表啥意思 ? /a显示具有指定属性的文件, D 目录,  难道/a-d 与/ad是一个意思? 表示只是显示目录? 好像不对啊,显示的文件啊 ,,
回复

使用道具 举报

33#
发表于 2024-3-25 23:36:57 | 只看该作者
本帖最后由 dos时代菜鸟 于 2024-3-25 23:54 编辑
  1. @echo off
  2. for %%w in (c,d,e,f,g,h,i,j,k,l,m) do (
  3.     if exist %%w:\ (
  4.         dir /r /b /s  /a-d %%w:\*.txt %%w:\*.jpg
  5.     )
  6. )
  7. pause
复制代码

点评

dir命令竟然可以这样写: dir /r /b /s /a-d c:\*.txt c:\*.jpg --学习到了,感谢! /r 显示文件的备用数据流; /b 使用空格式(没有标题信息或摘要); /s 显示指定目录和所有子目录中的文件 /a-d 这个代  详情 回复 发表于 2024-3-26 15:49
回复

使用道具 举报

32#
发表于 2024-3-25 23:23:34 | 只看该作者
本帖最后由 dos时代菜鸟 于 2024-3-25 23:40 编辑

哪有那么麻烦?
而且 就楼主需求, 有没有 setlocal enabledelayedexpansion 有啥关系么?

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%w in (c,d,e,f,g,h,i,j,k,l,m) do (
  4.     if exist %%w:\ (
  5.         pushd %%w:\
  6.         for /R .  %%i in ( *.txt *.jpg ) do (echo %%~i)
  7.     )
  8. )
  9. pause
复制代码




回复

使用道具 举报

31#
发表于 2024-3-20 14:59:13 | 只看该作者
去掉@echo off
在每一句后面加个pause,同时在pause前面用echo来显示每个变量的值,这样就能找到是哪一句出问题了。这是我在学习写批处理时想到的,真的很实用。
回复

使用道具 举报

30#
发表于 2024-3-14 21:13:52 | 只看该作者
观摩
回复

使用道具 举报

29#
发表于 2024-3-13 11:49:11 | 只看该作者
文心一言有用吗
回复

使用道具 举报

28#
发表于 2024-3-12 23:04:19 | 只看该作者
观摩
回复

使用道具 举报

27#
发表于 2024-2-23 11:49:28 | 只看该作者
咨询 文心一言 试试
回复

使用道具 举报

26#
发表于 2024-2-23 10:34:54 | 只看该作者
有钱人啊
回复

使用道具 举报

25#
发表于 2024-2-23 09:36:36 | 只看该作者
likeyouli 发表于 2024-2-23 09:24
这个有点编程语句的感觉,,倒不大像批处理了 ,,
  改天有空深研究下,包括powerShell都得学学了

进cmd打,将size往大了调,譬如FileSize>'15641338880'
回复

使用道具 举报

24#
 楼主| 发表于 2024-2-23 09:24:13 | 只看该作者
szwp 发表于 2024-2-23 09:01
wmic datafile where "(Extension='txt' or Extension='exe') and FileSize>'1000000'" get name,FileSize

这个有点编程语句的感觉,,倒不大像批处理了 ,,
  改天有空深研究下,包括powerShell都得学学了

点评

进cmd打,将size往大了调,譬如FileSize>'15641338880'  详情 回复 发表于 2024-2-23 09:36
回复

使用道具 举报

23#
发表于 2024-2-23 09:01:49 | 只看该作者
wmic datafile where "(Extension='txt' or Extension='exe') and FileSize>'1000000'" get name,FileSize

点评

这个有点编程语句的感觉,,倒不大像批处理了 ,, 改天有空深研究下,包括powerShell都得学学了  详情 回复 发表于 2024-2-23 09:24
回复

使用道具 举报

22#
 楼主| 发表于 2024-2-23 07:34:11 | 只看该作者
本帖最后由 likeyouli 于 2024-2-23 07:52 编辑

https://blog.51cto.com/u_8081755/3351480
里边的内容转自批处理之家,,还竟然当成自己的不让复印,,
   看样子需要系统研读批处理之家的教程了
回复

使用道具 举报

21#
 楼主| 发表于 2024-2-23 07:28:07 | 只看该作者
天使说请安静 发表于 2024-2-22 23:29
不对,括号外面的 | 优先级并没有高于括号,例如 (echo select disk 0&echo list vol)|diskpart ,这个我就 ...

刚又搜了下 ,https://zhidao.baidu.com/question/306202773385856644.html
以下为引用:
for/f中的命令如果有特殊字符需要加转义字符^,您的批处理改成这样就行了。
@echo off
setlocal enabledelayedexpansion
for /f "tokens=2" %%i in ('systeminfo ^|findstr "系统型号:"') do (set Model=%%i)
echo %Model%
回复

使用道具 举报

20#
发表于 2024-2-22 23:29:04 | 只看该作者
天使说请安静 发表于 2024-2-22 23:19
findstr默认(强制)使用正则表达式.前面的 /l 貌似并没有起作用,所以还是需要转义."" 在这里只起到囊括空 ...

不对,括号外面的 | 优先级并没有高于括号,例如 (echo select disk 0&echo list vol)|diskpart ,这个我就不知道该怎么说明了...

点评

刚又搜了下 ,https://zhidao.baidu.com/question/306202773385856644.html 以下为引用: for/f中的命令如果有特殊字符需要加转义字符^,您的批处理改成这样就行了。 @echo off setlocal enabledelayedexpansion  详情 回复 发表于 2024-2-23 07:28
回复

使用道具 举报

19#
发表于 2024-2-22 23:19:21 | 只看该作者
likeyouli 发表于 2024-2-22 22:14
@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m) do if exist %%w: (call :haha %%w:\)
:haha

findstr默认(强制)使用正则表达式.前面的 /l 貌似并没有起作用,所以还是需要转义."" 在这里只起到囊括空格的作用.
mountvol后的^是因为 | 的优先级大于括号,所以会在这里中断.批处理的符号是有优先级的,比如% 优先于 | 优先于 括号 优先于  > 等等.
至于怎么想到的,我没想到,而是以前遇到和你一样的问题,然后百度出来的.失败过很多次,然后慢慢积累过后学会有限应用了.

点评

不对,括号外面的 | 优先级并没有高于括号,例如 (echo select disk 0&echo list vol)|diskpart ,这个我就不知道该怎么说明了...  详情 回复 发表于 2024-2-22 23:29
回复

使用道具 举报

18#
 楼主| 发表于 2024-2-22 22:14:59 | 只看该作者
天使说请安静 发表于 2024-2-22 21:17
你可以试试
@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m,z) do (

@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m) do if exist %%w: (call :haha %%w:\)
:haha
for /r %1 %%i in (*.txt) do echo %%~i
  直接这样写也行,感谢您,代码越来越精炼了。
    /c:":\\"实际想要表达的是搜索:\, 这句话不好理解,我刚才也测试了,如果改为/c:":\",确实搜索不到:\, 只有再多加个\才可以,可是这里又不是正则表达式,而且还在“”里边,为什么需要多加个\进行转义呢 ?反正如果是我写搜索条件,我是怎么也不会想到的,,
      mountvol后的^也不好理解,mountvol|findstr ,这两个命令是写在括号里边的,肯定会看成一个整体执行,mountvol的结果直接传递给findstr进行查找,干嘛需要转义符  ?不加转义符,为什么for命令会在这里结束? 换句话说,系统对代码的解析到底是怎样进行的 ?您一开始怎么会想到需要加转义符的 ?您用什么样的逻辑推理,使您想到这里必须加个转义符 ?

点评

findstr默认(强制)使用正则表达式.前面的 /l 貌似并没有起作用,所以还是需要转义."" 在这里只起到囊括空格的作用. mountvol后的^是因为 | 的优先级大于括号,所以会在这里中断.批处理的符号是有优先级的,比如% 优先  详情 回复 发表于 2024-2-22 23:19
回复

使用道具 举报

17#
发表于 2024-2-22 21:31:00 | 只看该作者
天使说请安静 发表于 2024-2-22 21:27
('mountvol^|findstr /l  /i /c:":\\"')中mountvol是列出机器里的所有列出卷装入点. | 作用是把 mountvol ...

('mountvol^|findstr /l  /i /c:":\\"')的转义符是告诉For命令在这里把它当做括号内命令的一部分
如果不加转义符,for命令会在这里结束并且把 For /f %%i in ('mountvol 的运行结果直接输入到 findstr 里
回复

使用道具 举报

16#
发表于 2024-2-22 21:27:47 | 只看该作者
likeyouli 发表于 2024-2-22 20:46
('mountvol^|findstr /l  /i /c:":\\"') 括号里这段代码没看懂,,
mountvol 后边加转义符和管道符,不 ...

('mountvol^|findstr /l  /i /c:":\\"')中mountvol是列出机器里的所有列出卷装入点. | 作用是把 mountvol的结果输出到 findstr作为输入
findstr的参数中 /c:":\\"中第一个 \ 其实是转义符,作用等同前面的 ^ , /c:":\\" 实际想要表达的是搜索 :\
你可以尝试cmd里单独运行 mountvol 命令,管道符 |  作用是把它输出的全部内容传递给 findstr 而不是其结果的第一行.
findstr搜索 :\ 是搜索mountvol 的输出中带有 :\ 的部分,例如 C:\ D:\

点评

('mountvol^|findstr /l /i /c:":\\"')的转义符是告诉For命令在这里把它当做括号内命令的一部分 如果不加转义符,for命令会在这里结束并且把 For /f %%i in ('mountvol 的运行结果直接输入到 findstr 里  详情 回复 发表于 2024-2-22 21:31
回复

使用道具 举报

15#
发表于 2024-2-22 21:17:09 | 只看该作者
本帖最后由 天使说请安静 于 2024-2-22 22:05 编辑
likeyouli 发表于 2024-2-22 19:56
感谢,批处理是自上而下、逐条执行,通过call,使代码分为了两条,就不用延迟变量了 。
按您的方式,我 ...

你可以试试
@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m,z) do (
  if exist %%w: (    echo %%w:\>>pan.txt
    call :haha %%w:\
  )
)
pause
:haha
for /r %1 %%i in (*.zip) do echo %%~i
这一For次数可以减一次


点评

@echo off for %%w in (c,d,e,f,g,h,i,j,k,l,m) do if exist %%w: (call :haha %%w:\) :haha for /r %1 %%i in (*.txt) do echo %%~i 直接这样写也行,感谢您,代码越来越精炼了。 /c:":\\"实际想要表达  详情 回复 发表于 2024-2-22 22:14
回复

使用道具 举报

14#
发表于 2024-2-22 20:52:42 | 只看该作者
谢谢分享
回复

使用道具 举报

13#
 楼主| 发表于 2024-2-22 20:46:14 | 只看该作者
天使说请安静 发表于 2024-2-22 18:20
@echo off
For /f %%i in ('mountvol^|findstr /l  /i /c:":\\"') do call :Sec %%i
pause

('mountvol^|findstr /l  /i /c:":\\"') 括号里这段代码没看懂,,
mountvol 后边加转义符和管道符,不知道表示啥意思,
findstr 是查找字符串,/l表示按字使用搜索字符串,/i 表示不区分大小写,/c:及后边表示 使用:\\ 作为搜索内容,,
     在cmd下输入mountvol,会输出“当前装入点的 VolumeName 可能值”,通过管道符传递给findstr,可管道符前边为什么要加转义符呢 ?即便将 “当前装入点的 VolumeName 可能值” 传递给findstr了,可怎么又通过查找:\\来输出c:\ d:\ 呢 ?   真是难以理解!!

点评

('mountvol^|findstr /l /i /c:":\\"')中mountvol是列出机器里的所有列出卷装入点. | 作用是把 mountvol的结果输出到 findstr作为输入 findstr的参数中 /c:":\\"中第一个 \ 其实是转义符,作用等同前面的 ^ , /c:":  详情 回复 发表于 2024-2-22 21:27
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-14 06:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表