Board logo

标题: [文件操作] 求助批处理提取文件名标题关键字 [打印本页]

作者: iii888iii    时间: 2022-4-4 01:53     标题: 求助批处理提取文件名标题关键字

求助一个代码.
案例:  
                                                                                             红色这个,关键字,提取
d:\ok \3-2案例1(注)_中文_2018年04月15日01时45分_中文_中文_663793_180403_298[忽略].xlsx

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

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

谢谢大家
作者: WHY    时间: 2022-4-4 20:51

本帖最后由 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. }
复制代码

作者: iii888iii    时间: 2022-4-5 01: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

请按任意键继续. . .
作者: iii888iii    时间: 2022-4-5 01:45

成功了.....路径没弄对,

时间耗费有点多,20多秒
作者: Batcher    时间: 2022-4-5 17:20

回复 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"
复制代码

作者: iii888iii    时间: 2022-4-5 20:47

速度1.5秒,爽,感谢
作者: iii888iii    时间: 2022-4-5 22:12

回复 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"
作者: iii888iii    时间: 2022-4-5 22:18

麻烦帮我改为,直接提取,不考虑删除.
作者: WHY    时间: 2022-4-5 22:19

回复 4# iii888iii


    你用的是什么系统?是不是首次启用 PowerShell?
作者: WHY    时间: 2022-4-5 22:20

  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. }
复制代码

作者: Batcher    时间: 2022-4-5 22:39

回复 7# iii888iii


请参考Q-01观察一下执行到哪行代码的时候“不行了”:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: iii888iii    时间: 2022-4-5 23:44

找到问题所在了

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

这句漏改...




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2