无忧启动论坛

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

set命令给数字从小到大排序及set call和 call set

[复制链接]
跳转到指定楼层
1#
发表于 2023-10-19 13:05:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

为什么有时要用set call,有时要用call set

11.txt内容如下:
700.00
699
6
9.9899
0.6
9.989891234567
15.34
9.98989123453999
3.4
10

运行下面批处理:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,4) do set "kong=!kong!#"
for /f "tokens=1,2 delims=." %%i in (11.txt) do (
set p=%%i
set "str=!p!%kong%"
call set "a=!str:~,4!"
call set "a=%%a:!p!=%%"
if not "%%j"=="" (set "_!a!!p!.%%j=a") else set "_!a!!p!=a"
)
echo.
echo.
for /f "delims==_" %%i in ('set _') do (
set "str=%%i"
echo !str:#=!
)
pause>nul


结果为:
0.6
3.4
6
9.98989123453999
9.989891234567
9.9899
10
15.34
699
700.00


另一个批处理:
@echo off&setlocal enabledelayedexpansion
rem 微软小工具PsInfo64.exe
for /f "tokens=1,7,8 delims= " %%a in ('PsInfo64 -d 2^>nul^|findstr "GB"') do (
echo %%a %%b %%c|find "GB">NUL&&if /i not exist %%a\WINDOWS\System32\slmgr.vbs set t=%%b %%a

for /l %%c in (1,1,5) do set "kong=!kong!#"
for /f "tokens=1,2,3 delims=. " %%i in ("!t!") do (
set p=%%i

set "str=!p!%kong%"
set call "a=!str:~,5!"
set call "a=%%a:!p!=%%"

if not "%%j"=="" (set "_!a!!p!.%%j GB %%k=a") else set "_!a!!p! GB %%k=a"
rem set t=
)
)
for /f "tokens=3 delims==_ " %%i in ('set _') do (
set "str=%%i"
)
echo.
echo !str:#=!分区 是排除系统分区后剩余空间最大分区
echo.
pause





2#
发表于 2023-10-19 13:42:59 | 只看该作者
抢占沙发
回复

使用道具 举报

3#
发表于 2023-10-19 14:00:23 | 只看该作者
这用法有点高端
回复

使用道具 举报

4#
发表于 2023-10-19 14:48:19 | 只看该作者
感谢分享!
回复

使用道具 举报

5#
发表于 2023-10-19 15:52:24 | 只看该作者
看上去很厉害的样子。感谢分享。
回复

使用道具 举报

6#
发表于 2023-10-19 21:52:19 | 只看该作者
感谢分享!
回复

使用道具 举报

7#
发表于 2023-10-19 22:13:56 | 只看该作者
本帖最后由 nttwqz 于 2023-10-19 22:29 编辑
  1. @echo off
  2. pushd %~dp0

  3. ::call可用于多重变量嵌套,就像下面这样,但是这样会有一堆%,不易读,你在网上看到好几个call call call call和后面很长一串%就是这种用法。

  4. set var=abc
  5. set abc=456
  6. set n456=1234567890

  7. echo %var%
  8. call echo %%%var%%%
  9. call call echo %%%%n%%%var%%%%%%%
  10. call call set str=%%%%n%%%var%%%%%%%
  11. set str

  12. ::相对而言,使用for进行变量嵌套,简单易懂,代码易读,推荐使用。
  13. setlocal enabledelayedexpansion
  14. for %%a in (%var%) do for %%b in (!%%a!) do echo !n%%b!

  15. ::call的使用严重会影响效率,比使用外置命令比如findstr影响严重的多的多,尽量不要在for中使用call,除标签模块化外非必要时应减少call的使用
  16. set ta=!time!
  17. for /l %%a in (1 1 10000) do echo %%a
  18. set tb=!time!
  19. title !ta!-!tb!

  20. set ta_=!time!
  21. for /l %%a in (1 1 10000) do call :label %%a
  22. set tb_=!time!
  23. title !ta!-!tb!/!ta_!-!tb_!
  24. pause
  25. exit


  26. :label
  27.     echo %1
  28. goto :eof
复制代码


set call本假大神认为是错误用法,等于定义了一个call+空格+后面字符的变量,不知道其他真大神是怎么认为的。

变量嵌套可看一下和本坛同服务器的批处理之家的教程
批处理脚本高级编程技巧——变量嵌套

一个批处理效率的帖子
提高批处理代码效率的常用技巧及方案1[20090607]

回复

使用道具 举报

8#
发表于 2023-10-19 22:39:22 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
发表于 2023-10-20 09:51:33 | 只看该作者
感谢
回复

使用道具 举报

10#
发表于 2023-10-20 12:16:37 | 只看该作者
set call 在代码的用法是错误的,例如,set call "a=1"实际上是为变量call "a赋值为1"。
你贴的第二段代码还有多处错误。
回复

使用道具 举报

11#
 楼主| 发表于 2023-10-20 14:06:37 | 只看该作者
本帖最后由 yjqd 于 2023-10-20 14:31 编辑

我还以为是set call起了作用,后来我将两个call分别改为:
set 那又鸟 "a=!str:~,5!"
set 马户 "a=%%a:!p!=%%"
运行结果还是正确的
删除原来下面三项
set "str=!p!%kong%"
set call "a=!str:~,5!"
set call "a=%%a:!p!=%%"
运行结果还是正确的

分析了下此批处理,原来是凑巧,所以经过上述的命令运行结果都正确
因为取得的分区容量的整数部分位数都相同,所以无关乎!a!有无结果

回复

使用道具 举报

12#
 楼主| 发表于 2023-10-20 16:14:47 | 只看该作者

这下正确了:

@echo off&setlocal enabledelayedexpansion

rem 微软小工具PsInfo64.exe

for /l %%c in (1,1,5) do set "kong=!kong!#"
for /f "tokens=1,7,8 delims= " %%a in ('PsInfo -d 2^>nul^|findstr "GB"') do (
echo %%a %%b %%c|find "GB">NUL&&if /i not exist %%a\WINDOWS\System32\slmgr.vbs set t=%%b %%a
for /f "tokens=1,2,3 delims=. " %%i in ("!t!") do (
set p=%%i

set "str=!p!!kong!"
call set "x=!str:~,5!"              ::此处变量不要设为a,否则,下个语句会有%%a,会被解析为上面紫色处的变量%%a
call set "x=%%x:!p!=%%"
if not "%%j"=="" (set "_!x!!p!.%%j GB %%k=a") else set "_!x!!p! GB %%k=a"
)
)

for /f "tokens=3 delims==_ " %%i in ('set _') do (
set "str=%%i"
)
echo.
echo !str:#=!分区 是排除系统分区后剩余空间最大分区
echo.
pause

回复

使用道具 举报

13#
发表于 2023-10-21 16:36:17 | 只看该作者
set  call 玩了近20年批处理还真头一次见。

call set 是为了新开一个环境用来展开 %var%,这样就可以不用开变量扩展了。

回复

使用道具 举报

14#
发表于 2023-11-16 17:17:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

15#
发表于 2024-2-20 07:36:20 | 只看该作者
谢谢分享
回复

使用道具 举报

16#
发表于 2024-2-20 11:12:17 来自手机 | 只看该作者
感谢分享,学习了
回复

使用道具 举报

17#
发表于 2024-2-20 14:51:03 | 只看该作者
感谢分享!
回复

使用道具 举报

18#
发表于 2024-2-20 22:06:10 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

19#
发表于 2024-2-21 18:01:01 来自手机 | 只看该作者
学习了
回复

使用道具 举报

20#
发表于 2024-2-24 13:16:23 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-7 08:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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