找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30665|回复: 10

[文本处理] [已解决]这段代码为什么被跳过不能执行?只能被调用

[复制链接]
发表于 2018-6-7 10:50:38 | 显示全部楼层 |阅读模式
本帖最后由 aztec 于 2018-6-8 00:15 编辑

@echo off & setlocal enabledelayedexpansion
for /f "delims=g" %%a in ('cmd /u /cEcho,有') do set "Tab=%%a"
set w=wmic diskdrive where "MediaType like 'fixed%%'"
set "w=%w% get DeviceID^,Model^,Size"

for /f "tokens=1*delims==" %%i in ('%w% /value ^| find "="') do (
    if /i "%%i" == "DeviceID" set /a n+=1
    set "%%i!n!=%%j"
)

set "w1=wmic path Win32_DiskDriveToDiskPartition get Antecedent^,Dependent"
set "w2=wmic path Win32_LogicalDiskToPartition get Antecedent^,Dependent"
(for /l %%i in (1 1 !n!) do (
    call :GetSize !Size%%i!000 size
    if !size! gtr 102400 (set /a size/=1024 & set "G= GB") else set "G= MB"
    set /p=硬盘%%i:%Tab%<nul
    set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
    set /p=型号:!Model%%i!<nul
    echo,

    for /f tokens^=4delims^=^" %%a in ('%w1% ^| find /i """!DeviceID%%i!"""') do (
        for /f tokens^=4delims^=^" %%b in ('%w2%^|find /i """%%a"""') do (
            set "w3=wmic logicaldisk where "Name='%%b'" get FreeSpace^,Size"
            for /f "tokens=1,2" %%c in ('!w3!^|findstr [0-9]') do (
                call :GetSize %%c000 free
                call :GetSize %%d000 size
                set /a used=size-free
                if !size! gtr 102400 (
                    set /a size/=1024,used/=1024 & set "G= GB"
                ) else set "G= MB"
                set /a used=1000*used/size
                if "!used:~,-1!" == "" set "used=0!used!"
                set /p=分区%%b%Tab%<nul
                set /p=大小:!size:~,-2!.!size:~-2!!G!%Tab%<nul
                if !free! gtr 102400 (
                    set /a free/=1024 & set "G= GB"
                ) else set "G= MB"
                set /p=剩余:!free:~,-2!.!free:~-2!!G!%Tab%<nul
                set /p=使用率:!used:~,-1!.!used:~-1!%%<nul
                echo,
            )
        )
    )
    echo,
))
pause & exit/b

:GetSize
set "num=%1" & set "n=" & set "%2="
for %%a in (16 8 4 2 1) do (
    if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
)
set "num=%1" & set /a n-=6
for /l %%a in (!n! -1 1) do (
    set "s=!num:~,-%%a!"
    if "!s:~,1!" == "0" set "s=!s:~1!"
    set /a m=s%%1048576,s/=1048576
    set "%2=!%2!!s!"
    set "num=!m!!num:~-%%a!"
)
if not defined %2 (
    set "%2=!num:~,-1!"
) else if "!%2:~,1!" == "0" set "%2=!%2:~1!"

这段代码,我想用在自己的bat中,但是如果是直接放进去,不管是放在头尾中间什么地方都不行,直接跳过了,唯一方法是只能将其保存为bat,用call调用,应该是环境变量的问题,但不知道怎么修改,还请各位老师赐教

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2018-6-7 14:17:57 | 显示全部楼层
把你测试的完整代码发出来看看
 楼主| 发表于 2018-6-7 14:40:30 | 显示全部楼层
本帖最后由 aztec 于 2018-6-7 14:47 编辑
把你测试的完整代码发出来看看
Batcher 发表于 2018-6-7 14:17



    就接着昨晚上的代码而已,没啥特殊
上面这段代码之后就接着以下代码:
@echo off

set /p "_path=请输入路径:"
set /p "name=请输入文件名称:"
echo 你的文件路径和名称是:%_path%%name%.txt

if not exist "%_path%" md "%_path%"
if exist "%_path%%name%.txt" (goto :A) else (goto :B)

pause&exit

:A
ECHO;文件存在
pause&goto:eof

:B
ECHO;文件不存在
pause&goto:eof

我的原意是先通过上面一楼的代码显示硬盘各分区的剩余空间,然后就选择在哪个空间比较大的分区建立文件夹输出文件,但是一楼的代码不管放在什么位置,都是跳过了不执行,只能保存为另一bat,再用call调用bat
发表于 2018-6-7 16:54:30 | 显示全部楼层
回复 3# aztec


    要么去1群,要么加QQ,我发个代码给你.你这整得好复杂,看得头晕.
发表于 2018-6-7 18:43:22 | 显示全部楼层
回复 3# aztec


    把顶楼的 pause & exit/b 这一行删掉,再把你的代码插入到删掉的 pause & exit/b 这个位置。

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2018-6-7 19:20:53 | 显示全部楼层
回复  aztec


    把顶楼的 pause & exit/b 这一行删掉,再把你的代码插入到删掉的 pause & exit/b 这 ...
WHY 发表于 2018-6-7 18:43


谢谢啦!问题解决了! 可以运行了,确实牛!佩服啊!论坛卧虎藏龙,强中更有强中手
 楼主| 发表于 2018-6-7 19:23:32 | 显示全部楼层
回复  aztec


    要么去1群,要么加QQ,我发个代码给你.你这整得好复杂,看得头晕.
yhcfsr 发表于 2018-6-7 16:54


谢谢啦!已经解决了,感谢您的支持!
发表于 2018-6-7 19:30:18 | 显示全部楼层
本帖最后由 yhcfsr 于 2018-6-7 20:03 编辑
  1. @set @n=0/*&echo off
  2. for /f "delims=" %%a in ('Wmic Logicaldisk Get Name^|cscript -nologo -e:jscript "%~f0"') do (
  3.         echo;%%a
  4. )
  5. set /p "_path=请输入路径:"
  6. set /p "name=请输入文件名称:"
  7. echo 你的文件路径和名称是:%_path%%name%.txt

  8. if not exist "%_path%" md "%_path%"
  9. if exist "%_path%%name%.txt" (goto :A) else (goto :B)

  10. pause&exit /b

  11. :A
  12. ECHO;文件存在
  13. pause&goto:eof

  14. :B
  15. ECHO;文件不存在
  16. pause&goto:eof

  17. */

  18. var fso=new ActiveXObject('Scripting.FileSystemObject');
  19. WSH.StdIn.SkipLine();
  20. var drvSize=0,maxDrv='';
  21. while((drv=WSH.StdIn.ReadLine()).match(':')){          
  22.         drv=fso.GetDrive(fso.GetDriveName(drv));
  23.         fs=(drv.FreeSpace)/1024/1024;
  24.         if(fs>drvSize){drvSize=fs;maxDrv=drv;}
  25. switch(fs<1024){
  26.         case true:
  27.                 fs=fs.toString().replace(/(\d+\.\d{2}).*/,'$1');//MB->GB,取2位小数
  28.                 WSH.Echo(drv+' '+fs+' MB');break;
  29.         default:
  30.                 fs=(fs/1024).toString().replace(/(\d+\.\d{2}).*/,'$1');//MB->GB,取2位小数
  31.                 WSH.Echo(drv+' '+fs+' GB');
  32. }
  33. }
  34. WSH.Echo('建议分区 '+maxDrv);
复制代码
 楼主| 发表于 2018-6-7 19:45:56 | 显示全部楼层
回复 8# yhcfsr


Microsoft JScript 运行时错误: 磁盘没有准备好


C: 7.84 GB
D: 2.04 GB
E: 3.22 GB
F: 3.23 GB
G: 31.16015625 MB
H: 3.52 GB
I: 11.08 GB
请输入路径:

代码很棒,虽然还是提示有错误,尽管有些瑕疵,但是已经很好了,谢谢啦!
发表于 2018-6-7 20:10:22 | 显示全部楼层
回复 9# aztec


    代码修改:MB显示取两位小数点.
至于你说的问题,原因还不清楚,也可能是光驱问题,或者其他磁盘原因.没办法重现无法测试.我这边是测试通过的.
 楼主| 发表于 2018-6-7 21:40:27 | 显示全部楼层
回复  aztec


    代码修改:MB显示取两位小数点.
至于你说的问题,原因还不清楚,也可能是光驱问题,或者 ...
yhcfsr 发表于 2018-6-7 20:10



    好的,不管怎样还是谢谢您!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:57 , Processed in 0.023548 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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