无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7486|回复: 22
打印 上一主题 下一主题

【已解决】IF NOT EXIST filename command,怎么确定包含子目录下的文件?

[复制链接]
跳转到指定楼层
1#
发表于 2010-4-9 03:47:38 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
IF NOT EXIST X:\WXPE\SYSTEM32\PENETCFG.EXE GOTO END

“X:\WXPE\”下及其所有子目录下如果不存在PENETCFG.EXE那么GOTO END,怎么写,或者用什么代替这样的效果?

[ 本帖最后由 guanjinman 于 2010-4-12 07:00 编辑 ]
23#
发表于 2010-4-13 08:18:55 | 只看该作者

回复楼上

这里有  call  的用法实例,


这里有 setlocal enabledelayedexpansion  的用法实例

[ 本帖最后由 x9tian 于 2010-4-13 08:21 编辑 ]
回复

使用道具 举报

22#
 楼主| 发表于 2010-4-13 00:27:53 | 只看该作者
上面的测试在xp下的命令提示符下操作的, 应该支持变量延迟的吧 ,可结果还是显示“文件找不到”,没显示“no”

用call也在xp下试过 也不行

最后不想那么多,分成2条语句就ok了
回复

使用道具 举报

21#
发表于 2010-4-12 19:04:39 | 只看该作者

楼上, 你运用的代码没错

代码是正确的,  这不关带码的事,      可能是PE精简了的, 不支持变量延时,   建议你采用 call  + 百分号对
回复

使用道具 举报

20#
 楼主| 发表于 2010-4-12 17:29:31 | 只看该作者

回复 #19 x9tian 的帖子

试过你提供的变量延迟不行

setlocal enabledelayedexpansion
for /f %%i in ('dir /a-d/b/s PENETCFG.EXE') do set "PENETCFG.EXE=%%i" && if /I "!PENETCFG.EXE!"=="" echo no
pause
回复

使用道具 举报

19#
发表于 2010-4-12 11:02:14 | 只看该作者
原帖由 guanjinman 于 2010-4-12 05:03 发表
谢谢高手耐心指导!

for /f %%i in ('dir /a-d/b/s PENETCFG.EXE') do set PENETCFG.EXE=%%i
if /I "%PENETCFG.EXE%"=="" goto end


       什么高手,  我晕, 老兄你也太搞笑了,   这是错误出多了,自己在河里摸石头, 学会的教训

     这是变量延时的, 问题,      在dos 联盟的 一位大侠,    给出了两种答案





    一种,    setlocal  enabledelayedexpansion              要延时,变量,  %*%    变    !*!   例:    do  set  "penetcfg.exe=%%i"&&if  /i  "!pentcfg!"==""  goto  end


     二种   call   set   xx=%%xx%%            do   call  set "penetcfg.exe=%%i"& if  /i  "%%pentcfg%%"==""  goto  end



               注意下, 红色部份的细策差别

[ 本帖最后由 x9tian 于 2010-4-12 11:03 编辑 ]
回复

使用道具 举报

18#
 楼主| 发表于 2010-4-12 05:03:51 | 只看该作者

回复 #17 x9tian 的帖子

谢谢高手耐心指导!

后来发现一条命令实现不了,像for /f %%i in ('dir /a-d/b/s PENETCFG.EXE') do if /I "%%i"=="" goto end会提示找不到文件而不会goto end

分成2条就可以了
for /f %%i in ('dir /a-d/b/s PENETCFG.EXE') do set PENETCFG.EXE=%%i
if /I "%PENETCFG.EXE%"=="" goto end
----------------------------------------------------------

最终如下形式 OK!

PUSHD %~dp0
PUSHD X:\WXPE
for /f %%i in ('dir /a-d/b/s PENETCFG.EXE') do set PENETCFG.EXE=%%i
if /I "%PENETCFG.EXE%"=="" goto end
popd
set bootfile=PXELINUX.0
set BaseDirectory=
。。。。。。
回复

使用道具 举报

17#
发表于 2010-4-12 00:08:22 | 只看该作者
原帖由 guanjinman 于 2010-4-11 13:04 发表
for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  not "%%~nxi"=="PENETCFG.EXE'"   (echo.没pentcfg.exe) else  ( echo. pentcgf 存在)中是不是有笔误"PENETCFG.EXE'"里面的单引号应该没有 ...



               用for  /r 语句,我不赞成,  因为你必须生临时文件, 才能找到    for /r  是枚举,  我一般用它的目的, 是效验文件, 和补全文件,   


   找文件,  还是  dir  在行些,      楼主你就不要掉死在,  for /r 上面了,    上面的回复都只是说说 for /r   的特性    但真正用到它时, 还是效率文件缺失,  和效验后补全文件,



        dir /a-d/b/s    "PENETCFG.EXE" |find /i "PENETCFG.EXE" >nul &&echo. 成功持行我|| echo. 失败持行我&&echo.补充失败可持行项&echo.补充成功可持行项



         这是我把   dir  找文件老底交给你了,楼主 .╮( ̄﹏ ̄)╭
回复

使用道具 举报

16#
 楼主| 发表于 2010-4-11 13:04:40 | 只看该作者

回复 #15 x9tian 的帖子

for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  not "%%~nxi"=="PENETCFG.EXE'"   (echo.没pentcfg.exe) else  ( echo. pentcgf 存在)中是不是有笔误"PENETCFG.EXE'"里面的单引号应该没有的吧

for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  not "%%~nxi"=="PENETCFG.EXE'"   (echo.没pentcfg.exe) else  ( echo. pentcgf 存在) 改成

for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  not "%%~nxi"=="PENETCFG.EXE" goto end 后当不存在PENETCFG.EXE的时候仍然不会goto end(仍然用PENETCFG.BAK测试),下面放个pause截断,显示找不到文件后就暂停而没去goto end
回复

使用道具 举报

15#
发表于 2010-4-11 07:46:19 | 只看该作者
原帖由 guanjinman 于 2010-4-11 03:57 发表
第一条你都说不靠谱的我不去试了

for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  "%%~nxi"==""   goto end  (这个什么环境下都能胜任)我试过不行:当x:\wxpe\下及其所有子目录下都没有PENETCFG.EXE的时候仍然没有goto end。有PENETCFG.EXE不会goto end;没有PENETCFG.EXE也不会goto end ,所以这条等于没加(把PENETCFG.EXE改成PENETCFG.BAK测试)



for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  not "%%~nxi"=="PENETCFG.EXE'"   (echo.没pentcfg.exe) else  ( echo. pentcgf 存在)

     这个楼上老兄对不住啦,  我写错了,


         忘了 告诉你,  其实for /r, 像那样标记就是 有意 写错的,   为了只是证明 :   for /r   是枚举,   而不是搜索

                    枚举,  不查找, 不管有没有, 先假定它有,           搜索是, 给它一个搜索值, 它 按照文件夹下的文件名,傻傻的一个个去对比



              如果,   还没明白,  for /r   是枚举,  不是搜索,   你  把 do  后面, 写上  echo.%%i  就能看到效果,无论有没有要找的它全显示为有,   而去掉 /r  参数  却完全相反, 有就显示,没就无


          for /r  一样能让它正确运行,    :     其实三楼, 最后以给出了 正确的用法,  想要不出错 pushd  cd  /d  跳目录           

                 怎么跳? 我一般是用call  set "v=%%~i" &call set "lj=%%v:~-x%%                   (x  代表你要查找文件的位数, 如 penetcfg.exe   x 就是用12 )
回复

使用道具 举报

14#
 楼主| 发表于 2010-4-11 03:57:07 | 只看该作者

回复 #13

第一条你都说不靠谱的我不去试了

for /r "x:\wxpe\" %%i in (PENETCFG.EXE) do  if not exist %%i  goto end 自己老早试过不行

for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  "%%~nxi"==""   goto end  (这个什么环境下都能胜任)我试过不行:当x:\wxpe\下及其所有子目录下都没有PENETCFG.EXE的时候仍然没有goto end。有PENETCFG.EXE不会goto end;没有PENETCFG.EXE也不会goto end ,所以这条等于没加(把PENETCFG.EXE改成PENETCFG.BAK测试)

for /f  "tokens=2 delims=:" %%i in ('ipconfig^|find /i "IP Address"') do set "myip=%%i" &&goto n_
:n_------------0PE中的【PETOOLS\PXE服务器\启动Server(另一种).EXE】中就有类似这样的拿来放进去了:for /f "usebackq tokens=2 delims=:" %%i in (`ipconfig^|find "Address"`) do set myip=%%i
回复

使用道具 举报

13#
发表于 2010-4-10 07:17:48 | 只看该作者
for /r "x:\wxpe\" %%i in (PENETCFG.EXE) do  if not exist "%%~dpiPENETCFG.EXE"  goto end (这个有点不靠谱, for 带/r 参数, 就是指定死了目录,如果没有用pushd/cd, %~dpi   除非是指定下的目录才有效, 就像for /r  不支持%~$path:i  一样  )
或者
for /r "x:\wxpe\" %%i in (PENETCFG.EXE) do  if not exist %%i  goto end (这个估计不一定在复杂环境下成功)
或者
for  /f "delims=" %%i  in   ('dir /a-d/b/s PENETCFG.EXE')  do  if  "%%~nxi"==""   goto end  (这个什么环境下都能胜任)
另,  你把检查本地IP  的那一行这样改试下,  
for /f  "tokens=2 delims=:" %%i in ('ipconfig^|find /i "IP Address"') do set "myip=%%i" &&goto n_
:n_

看能不能在0PE下找到 本地IP  并把本地IP 设成MYIP

[ 本帖最后由 x9tian 于 2010-4-10 08:17 编辑 ]
回复

使用道具 举报

12#
 楼主| 发表于 2010-4-10 01:03:13 | 只看该作者

回复 #11 x9tian 的帖子

"for /r "x:\wxpe\" %%i in (PENETCFG.EXE) do if not exist PENETCFG.EXE goto end" 无效

明明在x:\wxpe\net下存在PENetCfg.exe,可还是goto end了

判断网络有没有启用用PENETCFG.EXE有没有存在不确切,有的pe没启动网络也存在PENETCFG.EXE文件,我也不知道用什么判断好?


if TCP/IP Protocol Driver 服务未启动 goto end 怎么写?
回复

使用道具 举报

11#
发表于 2010-4-9 15:06:26 | 只看该作者
1 改成
for /r "x:\wxpe\"  %%i in (PENETCFG.EXE)  do  if  not exist  PENETCFG.EXE   goto  end
2  0PE   基本上没用过,只下下来拆开看过, 应当可以用 ipconfig

3.  在批处理同目录下放个 7z.exe 就行了,  运行时省略7z的路径  com  exe  可以省略扩展  如: 7z  x "**"  -y -aos -o "**"
回复

使用道具 举报

10#
 楼主| 发表于 2010-4-9 14:32:40 | 只看该作者
看楼上的高手过招好专业啊!

主要是想弄个通用 HaneWin 网络服务器放在PETOOLS中让所有pe启动后随时开启HaneWin服务。
只是好些pe启动并启用网络支持后PENETCFG.EXE不确定在什么目录下,通常在X:\WXPE\SYSTEM32下,0PE的在X:\WXPE\NET下,网虫2008的在X:\WXPE\SYSTEM下......

自己乱凑的DHCP.CMD让高手们指点一二:

PUSHD %~dp0
CD /D "%CD%
IF NOT EXIST X:\WXPE\SYSTEM32\PENETCFG.EXE GOTO END
set bootfile=PXELINUX.0
set BaseDirectory=
for %%i in (C D E F G H I J K L M N O M P Q R S T U V W) DO IF EXIST %%i:\%bootfile% set BaseDirectory=%%i:\
7z.exe x DHCP.7z -y -aos -o"%WinDir%\System32"
setlocal
for /f "usebackq tokens=2 delims=[]" %%i in (`ping /n 1 %Computername%`) do set myip=%%i
for /f "tokens=1-3,4 delims=." %%i in ("%myip%") do set mynet=%%i.%%j.%%k
>%WinDir%\System32\DHCPsrv.ini echo.[License]
>>%WinDir%\System32\DHCPsrv.ini echo.Key=BBLZ26803UBBCAT9
>>%WinDir%\System32\DHCPsrv.ini echo.Name=Free User
>>%WinDir%\System32\DHCPsrv.ini echo.[DHCPsrv]
>>%WinDir%\System32\DHCPsrv.ini echo.Profile0=本地连接
>>%WinDir%\System32\DHCPsrv.ini echo.Include=%myip%
>>%WinDir%\System32\DHCPsrv.ini echo.TFTPDirectory=%BaseDirectory%
>>%WinDir%\System32\DHCPsrv.ini echo.Multicast=0
>>%WinDir%\System32\DHCPsrv.ini echo.TestIP=1
>>%WinDir%\System32\DHCPsrv.ini echo.TFTPEnable=1
>>%WinDir%\System32\DHCPsrv.ini echo.TFTPMode=0
>>%WinDir%\System32\DHCPsrv.ini echo.Log=0
>>%WinDir%\System32\DHCPsrv.ini echo.[本地连接]
>>%WinDir%\System32\DHCPsrv.ini echo.SubnetMask=255.255.255.0
>>%WinDir%\System32\DHCPsrv.ini echo.BaseIP=%mynet%.100
>>%WinDir%\System32\DHCPsrv.ini echo.Range=101
>>%WinDir%\System32\DHCPsrv.ini echo.NextIP=%myip%
>>%WinDir%\System32\DHCPsrv.ini echo.BootFile=%bootfile%
>>%WinDir%\System32\DHCPsrv.ini echo.RootPath=%computername%
>>%WinDir%\System32\DHCPsrv.ini echo.UseOpt=1
>>%WinDir%\System32\DHCPsrv.ini echo.DNSUpdate=0
>>%WinDir%\System32\DHCPsrv.ini echo.InterfaceIP=%myip%
dhcp4nt.exe -install
endlocal

PECMD.EXE LINK %USERPROFILE%\桌面\HaneWin 网启服务端,dhcpsrv.cpl,,dhcp.ico
PECMD.EXE LINK %USERPROFILE%\「开始」菜单\程序\网络启动服务器\关闭网络启动服务器,dhcp4nt.exe,-remove,shell32.dll#95
PECMD.EXE LINK %USERPROFILE%\「开始」菜单\程序\网络启动服务器\HaneWin 网启服务端,dhcpsrv.cpl,,dhcp.ico

PECMD.EXE ifex %WINDIR%\SYSTEM32\DHCP4NT.EXE,MESS 网启服务器已经成功启动。@通知: #ok *3000!MESS 未知错误,网启服务器没有成功启动。\n请查看网启文件是否损坏。 @通知: #ok *0
EXIT
:END
PECMD.EXE MESS 先启动网络支持程序.再启动网启服务器!@提示 #ok *6000
EXIT

--------------------------------------
几个地方要改改
1,IF NOT EXIST X:\WXPE\SYSTEM32\PENETCFG.EXE GOTO END要改成“X:\WXPE\”下及其所有子目录下如果不存在PENETCFG.EXE那么GOTO END

2,for /f "usebackq tokens=2 delims=[]" %%i in (`ping /n 1 %Computername%`) do set myip=%%i
for /f "tokens=1-3,4 delims=." %%i in ("%myip%") do set mynet=%%i.%%j.%%k通常都适用,可是对于0PE启动网络并设置IP后ping %Computername%是没返回值的(ping不通),所以要改改,不知道怎么改?

3,7z.exe x DHCP.7z -y -aos -o"%WinDir%\System32"中,7z.exe在系统中改名了(0PE中改成了7ZA.EXE),如果系统中没7z.exe呢?或者7z.exe版本问题不能解压DHCP.7z

共享想在PENETCFG.EXE中设置用户名密码并共享,所以上面就不事先加上了
回复

使用道具 举报

9#
发表于 2010-4-9 13:02:33 | 只看该作者

回楼上, for /r dir 区别

通常情况下, (不考虑 文件夹包含特殊符号, 比如点, 造成和文件件名相式),   用 for /r  效率要高蛮多,   在大量目录搜索下,  明显,   我一般不用 if exist  %%i,      因为, for /r   的判断模式是" 枚举"  而不是搜索,    直截 指定文件名,  干脆些 (最少运行时所用的内存拿显微镜看是偏小的, 因为,cmd.exe 省了变量替换,   同时在双 for 语句下更为名显 <( ̄oo, ̄)/)

      特殊情况下,  还是建议,  dir  /a-d(+d) /s /b *


     for /r   还有个BUG 就是, 一指定就指定死了目录,   不支持 %~$path:1

[ 本帖最后由 x9tian 于 2010-4-9 13:20 编辑 ]
回复

使用道具 举报

8#
发表于 2010-4-9 12:50:42 | 只看该作者
如果用for /r 应该是
for /r "x:\wxpe\"  %%i in (PENETCFG.EXE)  do  if  exist  %%i goto next
goto end
:next

应该效率是要比dir /s高一些
回复

使用道具 举报

7#
发表于 2010-4-9 12:34:52 | 只看该作者

回楼上

if exist    带I  参数,   是, 写习惯了 if  /i "" ==""   ,  一直没改过来,   加没加都一样, 就一直没改这习惯,

正像, 有些同志, if ()else ()  一样, 不留空格, 太照样能运行, 都是习惯养成的自然
回复

使用道具 举报

6#
发表于 2010-4-9 12:27:04 | 只看该作者
原帖由 x9tian 于 2010-4-9 12:20 发表
没看清一楼的题目


嗯,写快了,漏了目录

另外,不考虑什么时候转的问题,你的

if /i exist PENETCFG.EXE  应该也是写错了的吧

if exist %%i

红色这个应该是写快了,笔误吧?变量都不用

/i 在这里应该也是没用的,因为exist对文件是不分大小写的

[ 本帖最后由 NicTense 于 2010-4-9 12:38 编辑 ]
回复

使用道具 举报

5#
发表于 2010-4-9 12:20:16 | 只看该作者

回复楼上,

没看清一楼的题目<( ̄oo, ̄)/

    dir  /s/b    后面还要带操作目录呀, 不然持行的是当前及当前文件下的子目录,  

    for /r   if  exist  是枚举文件,判断,  持行效率 实践中, 要比dir  /s/b  高些,  在某些特殊情况下, 枚举,灵活性比 dir /s/b 要高些,, 如下:

@echo off&color %random:~-1%f&TITLE  音乐复制
SET/P var=把复制的标目录拖放到本窗口--^>^<--
if not defined var  (%0) else cd /d "%var%" ||%0&cls
:begin
set/p xx= [1] 复制 MP3 WMA RM格式的歌曲   [2] 只复制 MP3
echo.%xx%|find "1">nul&&set "xx=(*.mp3 *.wma *.rm)"||echo.%xx%|find "2">nul&&set "xx=(*.mp3)"|| echo.输入错误。。&&goto begin
for /r "E:\music\"  %%i in %xx%  do if not exist %%~ni* (copy "%%i" >nul 2>nul&&echo.成功复制=%%~nxi ||echo.&&echo.&&@echo.磁盘空间不足了 任意键退出...&&pause>nul&&exit)  else ( echo.&echo.存在歌曲=%%~ni    跳过&echo.)
pause&start "" "%cd%"

[ 本帖最后由 x9tian 于 2010-4-9 12:25 编辑 ]
回复

使用道具 举报

4#
发表于 2010-4-9 12:03:26 | 只看该作者
原帖由 x9tian 于 2010-4-9 06:28 发表
for /r "x:\wxpe\"  %%i in (PENETCFG.EXE)  do  if  /i exist  PENETCFG.EXE   goto  end


楼主是说找不到才goto end,你怎么找到了就goto end


dir x:\wxpe\PENETCFG.EXE /s /b|find /i "PENETCFG.EXE">nul || goto end

[ 本帖最后由 NicTense 于 2010-4-9 12:22 编辑 ]
回复

使用道具 举报

3#
发表于 2010-4-9 08:37:52 | 只看该作者
2楼正解,确实是这样的。
回复

使用道具 举报

2#
发表于 2010-4-9 06:28:21 | 只看该作者
for /r "x:\wxpe\"  %%i in (PENETCFG.EXE)  do  if  /i exist  PENETCFG.EXE   goto  end


               PS: 从本楼起以下面楼层的回复 大部份是说   for /r 的 特性,  上面命令 只能找 指定目录的文件,而不能正确找指定目录下子目录的文件,   for /r 本来就有的怪模怪样 楼下回复有描复

[ 本帖最后由 x9tian 于 2010-4-12 00:13 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-17 11:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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