标题: [文件操作] 求助批处理提取文件名标题关键字 [打印本页]
作者: 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 编辑
- <# :
- @echo off
- PowerShell -sta "(type '%~f0') -join \"`r`n\" | Invoke-Expression"
- pause & exit/b
- #>
-
- $srcDir = 'd:\ok';
- $id = @(dir $srcDir -Filter *.xlsx | ?{$_.BaseName -match '_(\d+)(?:_[^_]+){2}$'} | forEach{$matches[1]});
- if($id.Count -eq 1){
- sc 'd:\id.txt' $id[0];
- Add-Type -Assembly PresentationCore;
- [Windows.Clipboard]::SetText($id[0]);
- }else {
- Remove-Item ($srcDir + '\*') -Force -Recurse;
- }
复制代码
作者: 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 - @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- set XlsxNum=0
- for /f "delims=" %%i in ('dir /b /a-d "D:\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:\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:\ok\*.xlsx"') do (
- set FileID=%%i
- )
- >"D:\id.txt" set /p=!FileID!<nul
- clip<"D:\id.txt"
- goto :eof
-
- :ClearFolder
- rd /s /q "D:\ok"
- 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
- <# :
- @echo off
- PowerShell -sta "(type '%~f0') -join \"`r`n\" | Invoke-Expression"
- pause & exit/b
- #>
-
- $srcDir = 'D:\ok';
- $fileName = [Collections.ArrayList]@();
- forEach ( $file In (dir $srcDir -Filter *.xlsx) ){
- [void]$fileName.Add($file.Name);
- }
-
- if ($fileName.Count -eq 1 -and $fileName[0] -match '_(\d+)(?:_[^_]+){2}$'){
- sc 'D:\id.txt' $matches[1];
- Add-Type -Assembly PresentationCore;
- [Windows.Clipboard]::SetText($matches[1]);
- }else {
- Remove-Item ($srcDir + '\*') -Force -Recurse;
- }
复制代码
作者: 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://www.bathome.net/) |
Powered by Discuz! 7.2 |