[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
最喜欢的莫过于:
  1. ren *. *.jpg
复制代码
1

评分人数

    • plp626: 我win10提示“命令语法不正确。”,什么情况 ...PB + 2

TOP

回复 5# plp626


    笔误,实际上要说的是以下两个用法
  1. ren * *.jpg
  2. ren *.jpg *.
复制代码

TOP

本帖最后由 CrLf 于 2016-10-5 23:40 编辑

回复 6# codegay


    那末就贴上来吧:Batch-CN——在线第三方管理,已收集1600+第三方[2016.04.24更新]
    实际上已经 1800+ 了,网页版:http://www.bathome.net/s/tool/index.html
1

评分人数

    • plp626: bcn我还baidu/google搜索了,很棒PB + 10

TOP

对了,不能不提 用 nslookup 获取本机外网 IP

TOP

本帖最后由 CrLf 于 2016-10-17 04:04 编辑

回复 23# bailong360
  1. dir /s \ | find "Desktop"
复制代码
你会发现包括 more、find 在内的很多第三方工具是“边下边播”的,而 for /f %%a in ('[COMMAND]') do xx 则是要等 [COMMAND] 执行完毕才会开始 do


贴吧原帖链接:http://tieba.baidu.com/p/4377042621

这方法其实并没有太大的实用性...它的价值其实在于引出几个很有趣的问题:
这些输出是被谁吃了?
用 set /p 为什么会跳行(改用 c 语言编译的 gets 或 getch 亦然)?
又为什么不是在延时之后立刻出现跳行现象,而一定是发生在延时的下下次 set /p?
以及 ping 之后为什么会得到奇怪的结果?
为什么会 :OUT 居然会停下来等待 :IN 的 pause?

奉上测试代码,有心人自然会意:
  1. @echo off
  2. %1 %0 :OUT | %0 :IN
  3. goto %1 :eof
  4. :OUT
  5. set /a a+=1
  6. echo %a%
  7. title %a%
  8. goto :OUT
  9. :IN
  10. setlocal enabledelayedexpansion
  11. echo -----------------
  12. set /p input=
  13. echo     1:!input!
  14. set /p input2=
  15. echo     2:!input2!
  16. set /p input3=
  17. echo     3:!input3!
  18. set /p input4=
  19. echo     4:!input4! [before sleep]
  20. for /l %%a in (1 1 1000) do (cd .)
  21. set /p input5=
  22. echo     5:!input5! [after sleep]
  23. set /p input6=
  24. echo     6:!input6!
  25. set /p input7=
  26. echo     7:!input7!
  27. set /p input8=
  28. echo     8:!input8! [before ping]
  29. ping /n 1 127.1 >nul
  30. set /p input9=
  31. echo     9:!input9! [after ping]
  32. set /p input10=
  33. echo    10:!input10!
  34. set /p input11=
  35. echo    11:!input11!
  36. set /p input10=
  37. echo    12:!input12!
  38. set /p input10=
  39. echo    13:!input13! [before pause]
  40. pause<con
  41. set /p input10=
  42. echo    14:!input14! [after pause]
  43. set /p input10=
  44. echo    15:!input15!
  45. set /p input10=
  46. echo    16:!input16!
  47. pause<con
  48. endlocal
  49. goto :IN
复制代码
通过改变变量 a 的长度并观察 title 停止刷新时的值,解方程可知管道缓冲区的 BufferSize=4095,末尾必须用于存放 \0
于是前面的现象也就得到了解答——都是缓冲区惹的祸

【以下均为推测】
假设执行了一个 命令A | 命令B,在管道内发生了如下逻辑:
命令A 执行时,向缓冲区写入文本,
当缓冲区写满 4095 字节时(含回车换行),命令A 挂起,
当缓冲区被读取时,唤醒 命令A 继续执行(唤醒的过程可能会有一个耗时),
(存疑)在命令A 唤醒时,cmd 会清理一部分缓冲区(时多时少,规律不明),
当命令A 关闭时,命令B 的 stdin 为空

也就是说,跳行的原因还是一个谜

-----------------------------------------------------------------------------------
找到两篇文章,部分佐证了这个观点:
http://blog.csdn.net/qzwujiaying/article/details/6027570
http://blog.csdn.net/guang11cheng/article/details/17144907
3

评分人数

TOP

更有意思的是用不同方式同时读取 stdin,得到的内容居然是两条时间线:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. main(){
  4. int i=0,j=0;
  5. wchar_t str[8192]=L"";
  6. char temp[1111]="";
  7. for(i=0;++i;){
  8. Sleep(1000);
  9. fgetws(str,1024,stdin);
  10. wprintf(L"@1 %s\r\n",str);
  11. fgetws(str,1024,stdin);
  12. wprintf(L"@2 %s\r\n",str);
  13. system("set /p n=&call echo Batch: %n%");
  14. fgetws(str,1024,stdin);
  15. wprintf(L"@3 %s\r\n",str);
  16. fgetws(str,1024,stdin);
  17. wprintf(L"@4 %s\r\n",str);
  18. getch();
  19. }
  20. }
复制代码
结论:cmd 打破时空壁垒,穿越了

TOP

回复 27# Bella


    这是为什么呢?
1

评分人数

    • Bella: 严禁灌水技术 + 1

TOP

返回列表