[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 newswan 于 2021-10-5 13:15 编辑

回复 28# qixiaobin0715


vbs 不会,但是 powershell 效率低,是很无语的。ms 一向是这样
批处理+第三方 有时候也麻烦。

TOP

gnu命令: sed sort
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set path=%pathgnu%;%path%
  4. echo %path%
  5. set sour=新建文件夹
  6. set dest=bbb1
  7. set exclude=QQ
  8. del /q "%dest%\*.*"
  9. echo %~nx0 %time% 1 >>time.txt
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  11.     echo "%%~fa"
  12.     type "%%~fa" | sed -r -e "/\S+\s+\S+\s+\S+/^!d" -e "/%exclude%/d" -e "s/SZ/1/" -e "s/SH/0/" -e "s/\s+/^|/g"  >> "%dest%\%%~na.tmp"
  13. )
  14. echo,
  15. echo %~nx0 %time% 2 >>time.txt
  16. echo,
  17. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.tmp"`) do (
  18.     echo "%%~fa"
  19.     type "%%~fa" | sort.exe -u >>"%%~dpna.txt"
  20. )
  21. echo %~nx0 %time% 3 >>time.txt
  22. echo,
  23. del %dest%\*.tmp
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

gnu 命令 sed awk
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set path=%pathgnu%;%path%
  4. echo %path%
  5. set sour=新建文件夹
  6. set dest=bbb2
  7. set exclude=QQ
  8. del /q "%dest%\*.*"
  9. echo %~nx0 %time% 1 >>time.txt
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  11.     echo "%%~fa"
  12.     type "%%~fa" | sed -r -e "/\S+\s+\S+\s+\S+/^!d" -e "/%exclude%/d" -e "s/SZ/1/" -e "s/SH/0/" -e "s/\s+/^|/g"  >> "%dest%\%%~na.tmp"
  13. )
  14. echo,
  15. echo %~nx0 %time% 2 >>time.txt
  16. echo,
  17. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.tmp"`) do (
  18.     echo "%%~fa"
  19.     type "%%~fa" | awk " { arr[$0]++ ; if ( arr[$0] == 1 ) { print $0 } } "  >>"%%~dpna.txt"
  20. )
  21. echo %~nx0 %time% 3 >>time.txt
  22. echo,
  23. del %dest%\*.tmp
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

效率 比较
sed + sort
1.bat 16:01:09.17 1
1.bat 16:02:06.45 2
1.bat 16:02:21.43 3
sed + awk
2.bat 16:03:13.41 1
2.bat 16:04:11.68 2
2.bat 16:04:26.42 3

两种办法 效率相同,但是 ps 就差很多了。

TOP

本帖最后由 newswan 于 2021-10-5 21:07 编辑

回复 39# idwma


谢谢指点
net 没学过。。。
合并效率一样了,去重,还是很慢
  1. $sour = "D:\share\tech\New folder\新建文件夹"
  2. $dest = "D:\share\tech\New folder\ccc2"
  3. $exclude = "QQ"
  4. Remove-Item $dest\*.*
  5. ( $MyInvocation.MyCommand.Name + "  1  " + (get-date -Format "HH:mm:ss.ff").tostring() ) | out-file -Encoding ascii -append time.txt
  6. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  7.     $_.fullname
  8.     $filename = Join-Path -path $dest -ChildPath ($_.basename + ".tmp")
  9.     $a=( [IO.File]::ReadAllLines($_.fullname) )
  10.     $a = $a -match "\S+\s+\S+\s+\S+" -notmatch $exclude -replace "SZ","1" -replace "SH","0" -replace "\s+","|"
  11.     [IO.File]::AppendAllLines([string]$filename , [string[]]$a)
  12. }
  13. ( $MyInvocation.MyCommand.Name + "  2  " + (get-date -Format "HH:mm:ss.ff").tostring() ) | out-file -Encoding ascii -append time.txt
  14. Get-ChildItem -path $dest *.tmp | foreach-object {
  15.     $_.fullname
  16.     $filename = Join-Path -path $dest -ChildPath ($_.basename + ".txt")
  17.     $ht = @{}
  18.     $a = ( [IO.File]::ReadAllLines($_.fullname) )
  19.     $a = $a | foreach-object {
  20.         if ( -not ( $ht.ContainsKey($_) ) )
  21.         {
  22.             $_
  23.             $ht.add($_,"1")
  24.         }
  25.     }
  26.     $a | out-file -Encoding utf8 $filename
  27. }
  28. ( $MyInvocation.MyCommand.Name + "  3  " + (get-date -Format "HH:mm:ss.ff").tostring() ) | out-file -Encoding ascii -append time.txt
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

回复 42# idwma


谢谢,这个用时是 unix 工具的 6 倍,比前面的要好多了

TOP

一段时间不用,很多都不熟悉了啊

TOP

相当于
  1. $null =
复制代码

TOP

本帖最后由 newswan 于 2021-10-8 17:54 编辑

同名文件分组,流式处理
需要 sed awk sort
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=新建文件夹
  4. set dest=%~n0
  5. set exclude=QQ
  6. set "_cmd_=dir /s /b %sour%\*.txt | sed -r -e "s/^.+[\]//" | sort -u"
  7. set _cmdsed_=-r -e "/%exclude%/d" -e "/^\S+\s+\S+\s+\S+$/^!d" -e "s/SZ/1/" -e "s/SH/0/" -e "s/\s+/^|/g"
  8. set _cmdawk_=" { arr[$0]++ ; if ( arr[$0] == 1 ) { print $0 } } "
  9. for /f "usebackq tokens=* delims=" %%a in (`cmd /c "%_cmd_%"`) do (
  10.     echo %%a
  11.     (
  12.         for /f "usebackq tokens=* delims=" %%b in (`dir /s /b "%sour%\%%a"`) do (
  13.             type "%%~fb"
  14.         ) | sed -r -e $a\
  15.     ) | sed !_cmdsed_! | awk !_cmdawk_! > "%dest%\%%~nxa"
  16. )
复制代码
ps: linux 的 sort 不是 windows自带的

TOP

本帖最后由 newswan 于 2021-10-9 12:55 编辑

回复 52# xczxczxcz


可以在vbs里加个计时器,完成后显示时长
这样时间比较准确

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. chcp 936
  4. set path=%pathgnu%;%path%
  5. set sour=新建文件夹
  6. set dest=%~n0
  7. set exclude=QQ
  8. if exist %dest% rd /s /q %dest%
  9. if not exist %dest% mkdir %dest%
  10. call :C_timer
  11. set "_cmd_=dir /s /b %sour%\*.txt | sed -r -e "s/^.+[\]//" | sort -u"
  12. set _cmdsed_=-r -e "/%exclude%/d" -e "/^\S+\s+\S+\s+\S+$/^!d" -e "s/SH/0/" -e "s/SZ/1/" -e "s/\s+/^|/g"
  13. set _cmdawk_=" { arr[$0]++ ; if ( arr[$0] == 1 ) { print $0 } } "
  14. for /f "usebackq tokens=* delims=" %%a in (`cmd /c "%_cmd_%"`) do (
  15.     echo %%a
  16.     (
  17.         for /f "usebackq tokens=* delims=" %%b in (`dir /s /b "%sour%\%%a"`) do (
  18.             type "%%~fb"
  19.         ) | sed -r -e $a\
  20.     ) | sed !_cmdsed_! | awk !_cmdawk_! > "%dest%\%%~nxa"
  21. )
  22. call :C_timer sum
  23. exit/b
  24. rem del %dest%\*.tmp
  25. :C_timer
  26. if not defined _ti_ set _ti_=-1
  27. set/a _ti_+=1
  28. set _tb_=%_te_%
  29. set _te_=%time%
  30. if %_ti_% EQU 0 (
  31.     set _tb_=%_te_%
  32. )
  33. set/a _tdiff_=(9%_te_:~0,2%-9%_tb_:~0,2%)*360000+(9%_te_:~3,2%-9%_tb_:~3,2%)*6000+(9%_te_:~6,2%%_te_:~9,2%-9%_tb_:~6,2%%_tb_:~9,2%)
  34. set/a _tdiff_=%_tdiff_:-=8640000-%
  35. set/a _tdiffSum_+=%_tdiff_%
  36. if "%_ti_%" == "0" (
  37.     (echo,) >>time.txt
  38.     (echo %~nx0  %_ti_%  %_te_%) >>time.txt
  39. ) else (
  40.     (echo %~nx0  %_ti_%  %_te_%  %_tdiff_:~0,-2%.%_tdiff_:~-2%) >>time.txt
  41. )
  42. if %1.==sum. (
  43.     (echo %~nx0                  %_tdiffSum_:~0,-2%.%_tdiffSum_:~-2%) >>time.txt
  44. )
  45. goto :eof
复制代码

TOP

本帖最后由 newswan 于 2021-10-9 13:33 编辑

回复 55# xczxczxcz


我的意思是加到vbs代码里,运行完毕显示用时
MsgBox "Done 用时 xx.xx "

TOP

本帖最后由 newswan 于 2021-10-9 15:34 编辑

回复 59# xczxczxcz


😓,搞错,是给 why 回复的。

没有禁用表情,怎么表情发不出

TOP

回复 50# WHY


可以加个计时功能,运行完成,显示用时

TOP

返回列表