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

[文件操作] 求助批处理提取文件名标题关键字

[复制链接]
发表于 2022-4-4 01:53:13 | 显示全部楼层 |阅读模式
求助一个代码.
案例:  
                                                                                             红色这个,关键字,提取
d:\ok \3-2案例1(注)_中文_2018年04月15日01时45分_中文_中文_663793_180403_298[忽略].xlsx

判断: o k 文件夹里面是否只有1个.xlsx文件.如果是,则,执行下面逻辑,否则清空该文件夹包含子目录所有文件,文件夹.

逻辑,如果是,  则,提取,红色的部分关键字(663793),保存到d:\id.txt文件,  并且输出到剪贴板(不要有空格或者回车符).

谢谢大家
发表于 2022-4-4 20:51:47 | 显示全部楼层
本帖最后由 WHY 于 2022-4-4 20:56 编辑
  1. <# :
  2. @echo off
  3. PowerShell -sta "(type '%~f0') -join "`r`n" | Invoke-Expression"
  4. pause & exit/b
  5. #>

  6. $srcDir = 'd:\ok';
  7. $id = @(dir $srcDir -Filter *.xlsx | ?{$_.BaseName -match '_(\d+)(?:_[^_]+){2}$'} | forEach{$matches[1]});
  8. if($id.Count -eq 1){
  9.     sc 'd:\id.txt' $id[0];
  10.     Add-Type -Assembly PresentationCore;
  11.     [Windows.Clipboard]::SetText($id[0]);
  12. }else {
  13.     Remove-Item ($srcDir + '\*') -Force -Recurse;
  14. }
复制代码

评分

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

查看全部评分

 楼主| 发表于 2022-4-5 01:43:43 | 显示全部楼层
回复 2# WHY


    不成功.

Invoke-Expression : 展开运算符“@”无法用于在表达式中引用变量。“@echo”只能用
作命令的参数。若要在表达式中引用变量,请使用“$echo”。
所在位置 行:1 字符: 118
+ (type 'C:\Users\Administrator\Desktop\读取文件列表\c1All随机文件夹名称 实例1
20220311032854\1.bat') -join "`r`n" | Invoke-Expression <<<<
    + CategoryInfo          : ParserError: (echo:String) [Invoke-Expression],
   ParseException
    + FullyQualifiedErrorId : SplattingNotPermitted,Microsoft.PowerShell.Comma
   nds.InvokeExpressionCommand

请按任意键继续. . .
 楼主| 发表于 2022-4-5 01:45:54 | 显示全部楼层
成功了.....路径没弄对,

时间耗费有点多,20多秒
发表于 2022-4-5 17:20:51 | 显示全部楼层
回复 1# iii888iii
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. set XlsxNum=0
  5. for /f "delims=" %%i in ('dir /b /a-d "D:\ok\*.xlsx" ^| find /v /c ""') do (
  6.     set XlsxNum=%%i
  7. )
  8. if !XlsxNum! neq 1 (
  9.     goto :ClearFolder
  10. ) else (
  11.     goto :GetID
  12. )
  13. set FileNum=0
  14. for /f "delims=" %%i in ('dir /b /a-d "D:\ok" ^| find /v /c ""') do (
  15.     set FileNum=%%i
  16. )
  17. if !FileNum! neq 1 (
  18.     goto :ClearFolder
  19. )

  20. :GetID
  21. for /f "tokens=6 delims=_" %%i in ('dir /b /a-d "D:\ok\*.xlsx"') do (
  22.     set FileID=%%i
  23. )
  24. >"D:\id.txt" set /p=!FileID!<nul
  25. clip<"D:\id.txt"
  26. goto :eof

  27. :ClearFolder
  28. rd /s /q "D:\ok"
  29. md "D:\ok"
复制代码
 楼主| 发表于 2022-4-5 20:47:54 | 显示全部楼层
速度1.5秒,爽,感谢
 楼主| 发表于 2022-4-5 22:12:10 | 显示全部楼层
回复 5# Batcher


    为什么我把目录改为

d:\temp\ok
就不行了呢,文件都删除了,  

或者不删除也不提前,调试好几次都不行.

@echo off
cd /d "D:\temp\ok"
setlocal enabledelayedexpansion
set XlsxNum=0
for /f "delims=" %%i in ('dir /b /a-d "D:\temp\ok\*.xlsx" ^| find /v /c ""') do (
    set XlsxNum=%%i
)
if !XlsxNum! neq 1 (
    goto :ClearFolder
) else (
    goto :GetID
)
set FileNum=0
for /f "delims=" %%i in ('dir /b /a-d "D:\temp\ok" ^| find /v /c ""') do (
    set FileNum=%%i
)
if !FileNum! neq 1 (
    goto :ClearFolder
)

:GetID
for /f "tokens=6 delims=_" %%i in ('dir /b /a-d "D:\temp\ok\*.xlsx"') do (
    set FileID=%%i
)
>"D:\id.txt" set /p=!FileID!<nul
clip<"D:\id.txt"
goto :eof

:ClearFolder
rd /s /q "D:\temp\ok"
md "D:\temp\ok"
 楼主| 发表于 2022-4-5 22:18:28 | 显示全部楼层
麻烦帮我改为,直接提取,不考虑删除.
发表于 2022-4-5 22:19:29 | 显示全部楼层
回复 4# iii888iii


    你用的是什么系统?是不是首次启用 PowerShell?
发表于 2022-4-5 22:20:14 | 显示全部楼层
  1. <# :
  2. @echo off
  3. PowerShell -sta "(type '%~f0') -join "`r`n" | Invoke-Expression"
  4. pause & exit/b
  5. #>

  6. $srcDir   = 'D:\ok';
  7. $fileName = [Collections.ArrayList]@();
  8. forEach ( $file In (dir $srcDir -Filter *.xlsx) ){
  9.     [void]$fileName.Add($file.Name);
  10. }

  11. if ($fileName.Count -eq 1 -and $fileName[0] -match '_(\d+)(?:_[^_]+){2}$'){
  12.     sc 'D:\id.txt' $matches[1];
  13.     Add-Type -Assembly PresentationCore;
  14.     [Windows.Clipboard]::SetText($matches[1]);
  15. }else {
  16.     Remove-Item ($srcDir + '\*') -Force -Recurse;
  17. }
复制代码
发表于 2022-4-5 22:39:51 | 显示全部楼层
回复 7# iii888iii


请参考Q-01观察一下执行到哪行代码的时候“不行了”:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
 楼主| 发表于 2022-4-5 23:44:37 | 显示全部楼层
找到问题所在了

>"D:\temp\id.txt" set /p=!FileID!<nul

这句漏改...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 05:53 , Processed in 0.019035 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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