likeyouli 发表于 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


martin313 发表于 2024-2-22 16:33:57

咨询 文心一言 试试

Anson4 发表于 2024-2-22 16:40:39

似乎括号内的逗号应该改成空格

zp1688 发表于 2024-2-22 16:42:31

文心一言清谱智言。。。

sunsea 发表于 2024-2-22 16:59:35

本帖最后由 sunsea 于 2024-2-22 17:01 编辑

@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
pushd "!tt!"
for /r %%i in (*.txt *.exe) do echo %%~i
popd
)
endlocal
pause
我也不太懂,但是试试看。

bjay2008xmy 发表于 2024-2-22 17:10:30

bjay2008xmy 发表于 2024-2-22 17:13:08

likeyouli 发表于 2024-2-22 17:15:23

bjay2008xmy 发表于 2024-2-22 17:10
@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 enabled ...

不用延迟变量,而用%tt%肯定能输出,但只会输出一个盘的文件,因为%tt%只会接收一个变量,您可以自己测试一下

likeyouli 发表于 2024-2-22 17:24:02

本帖最后由 likeyouli 于 2024-2-22 17:41 编辑

sunsea 发表于 2024-2-22 16:59
我也不太懂,但是试试看。
pushd "!tt!"
for /r %%i in (*.txt *.exe) do echo %%~i
popd
貌似可以,您用了pushd和popd, 这是啥东西,我先学习一下,,刚百度了一下,您这貌似变换了思路,既然FOR /R [path] %variable IN...这里的path不允许使用延迟变量,我干脆就不用延迟变量了,但如果不填drive:path参数的话,就会默认在当前批处理所在的文件夹下遍历文件,所以您先pushd,即临时更改目录,再popd(删除)这个目录(恢复到默认目录,即批处理所在的文件夹),下次再循环又会再变更新的目录(随着延迟变量而改变),,属于曲线救国,高!

rbwrbw 发表于 2024-2-22 17:30:12

这是干什么用,批处理太危险

天使说请安静 发表于 2024-2-22 18:20:57

@echo off
For /f %%i in ('mountvol^|findstr /l/i /c:":\\"') do call :Sec %%i
pause

:Sec
for /r %1 %%i in (*.txt *.exe) do echo %%~i
试试这个

Climbing 发表于 2024-2-22 19:11:00

你把批处理第一行中的echo off 改成echo on就知道原因了。
延迟变量在for命令中是无效的。

set tt=e:\
for /R !tt! %i in (*.exe) do echo %~i


所以只能曲线救国,pushd和11楼的call方式应该是有效的。https://cdn.jsdelivr.net/gh/master-of-forums/master-of-forums/public/images/patch.gif

likeyouli 发表于 2024-2-22 19:56:30

天使说请安静 发表于 2024-2-22 18:20
@echo off
For /f %%i in ('mountvol^|findstr /l/i /c:":\\"') do call :Sec %%i
pause


感谢,批处理是自上而下、逐条执行,通过call,使代码分为了两条,就不用延迟变量了 。
按您的方式,我改了一下,可以运行。
@echo off
for %%w in (c,d,e,f,g,h,i,j,k,l,m) do if exist %%w: echo %%w:\>>pan.txt
for /f %%s in (pan.txt)do call :haha %%s
:haha
for /r %1 %%i in (*.zip) do echo %%~i

likeyouli 发表于 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:\ 呢 ?   真是难以理解!!

nathan6498 发表于 2024-2-22 20:52:42

谢谢分享

天使说请安静 发表于 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次数可以减一次


天使说请安静 发表于 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:\

天使说请安静 发表于 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 里

likeyouli 发表于 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命令会在这里结束? 换句话说,系统对代码的解析到底是怎样进行的 ?您一开始怎么会想到需要加转义符的 ?您用什么样的逻辑推理,使您想到这里必须加个转义符 ?

天使说请安静 发表于 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后的^是因为 | 的优先级大于括号,所以会在这里中断.批处理的符号是有优先级的,比如% 优先于 | 优先于 括号 优先于> 等等.
至于怎么想到的,我没想到,而是以前遇到和你一样的问题,然后百度出来的.失败过很多次,然后慢慢积累过后学会有限应用了.

天使说请安静 发表于 2024-2-22 23:29:04

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

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

likeyouli 发表于 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%

likeyouli 发表于 2024-2-23 07:34:11

本帖最后由 likeyouli 于 2024-2-23 07:52 编辑

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

szwp 发表于 2024-2-23 09:01:49

wmic datafile where "(Extension='txt' or Extension='exe') and FileSize>'1000000'" get name,FileSize

likeyouli 发表于 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都得学学了

szwp 发表于 2024-2-23 09:36:36

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

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

zlzx01 发表于 2024-2-23 10:34:54

有钱人啊

夏阳 发表于 2024-2-23 11:49:28

咨询 文心一言 试试

偷镜像的贼 发表于 2024-3-12 23:04:19

观摩

dai202403 发表于 2024-3-13 11:49:11

文心一言有用吗
页: [1] 2
查看完整版本: 批处理又出问题了,各种百度、测试都不行,无奈求助.1000无忧币