标题: [文本处理] [已解决]批处理从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名) [打印本页]
作者: yyz219 时间: 2022-9-20 08:47 标题: [已解决]批处理从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名)
从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名),保存为1.txt
完美解决了:
- @echo off
- (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
- for /f tokens^=17^ delims^=^" %%j in (%%i) do (
- for /f "delims=-" %%k in ("%%j") do echo,%%k
- )
- ))>1.txt
复制代码
pause[/code]*****************************************************************
下面是不能正确输出的1.csv
https://pan.baidu.com/s/1D0-KYijTpeT6mD2UXB3r-g
作者: hfxiang 时间: 2022-9-20 09:35
试一下如下指令- for /f "tokens=1* delims=." %a in ('findstr /i "\<.*.exe" 1.txt') do @where %~a.exe
复制代码
作者: yyz219 时间: 2022-9-20 09:37
试一下如下指令
hfxiang 发表于 2022-9-20 09:35
我试一试先,辛苦了
作者: yyz219 时间: 2022-9-20 09:42
试一下如下指令
hfxiang 发表于 2022-9-20 09:35
不行,闪一下,也没有生成1.txt
作者: hfxiang 时间: 2022-9-20 09:53
回复 4# yyz219
2楼的指令在CMD窗口下执行,不是写在bat中执行,输入文件为1.txt,直接在屏幕上输出。
写在bat中执行的指令如下(以下指令提取的是.exe文件,其它的需自行改动):- @rem 保存文件编码为ANSI
- @echo 执行中请等候......
- @(for /f "tokens=1* delims=." %%a in ('findstr /i "\<.*.exe" 1.csv') do @where "%%~a.exe")>1.txt 2>nul
- @echo
- @echo 执行完毕......
复制代码
作者: qixiaobin0715 时间: 2022-9-20 10:01
最好能在网盘中传一份CSV文件看看。
作者: yyz219 时间: 2022-9-20 10:32
本帖最后由 yyz219 于 2022-9-20 10:34 编辑
最好能在网盘中传一份CSV文件看看。
qixiaobin0715 发表于 2022-9-20 10:01
https://pan.baidu.com/s/1AhboSmHTB7sLigWmDFuppw
作者: yyz219 时间: 2022-9-20 10:43
本帖最后由 yyz219 于 2022-9-20 10:48 编辑
回复 yyz219
2楼的指令在CMD窗口下执行,不是写在bat中执行,输入文件为1.txt,直接在屏幕上输出。
...
hfxiang 发表于 2022-9-20 09:53
我要提取的是文中粉红色的(这个是变化的)
作者: hfxiang 时间: 2022-9-20 10:55
回复 8# yyz219
直接在CMD窗口下试试如下指令:- @(for /f "tokens=10 delims=," %a in (1.csv) do @for /f %b in ('echo %~a^|findstr /i ".txt .ini .bat .vbs"') do @echo "%~b")>1.txt 2>nul
复制代码
作者: qixiaobin0715 时间: 2022-9-20 10:57
本帖最后由 qixiaobin0715 于 2022-9-20 11:16 编辑
回复 7# yyz219 - @echo off
- setlocal enabledelayedexpansion
- for %%x in (.txt .ini .bat .vbs) do set %%x=true
- (for /f "delims=" %%i in (1.csv) do (
- for %%j in (%%i) do (
- set str=%%j
- )
- for /f "delims=-" %%k in (!str!) do (
- if defined %%~xk echo,%%k
- )
- ))>1.txt
- pause
复制代码
看看显示是否正确
作者: yyz219 时间: 2022-9-20 11:13
回复 yyz219 看看显示是否正确
qixiaobin0715 发表于 2022-9-20 10:57
屏幕能够正确显示
再麻烦一下,让它在生成1.txt
谢谢
作者: qixiaobin0715 时间: 2022-9-20 11:16
回复 11# yyz219
已修改
作者: yyz219 时间: 2022-9-20 11:20
回复 yyz219
已修改
qixiaobin0715 发表于 2022-9-20 11:16
非常感谢,完美解决
作者: qixiaobin0715 时间: 2022-9-20 16:37
如果数据像你提供的那么规整的话,这样效率应当更高些:- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
- for %%j in (%%i) do set str=%%j
- for /f "delims=-" %%k in (!str!) do echo,%%k
- ))>1.txt
- pause
复制代码
未经测试。
作者: yyz219 时间: 2022-9-20 21:33
如果数据像你提供的那么规整的话,这样效率应当更高些:未经测试。
qixiaobin0715 发表于 2022-9-20 16:37
非常感谢
作者: yyz219 时间: 2022-9-20 22:22
本帖最后由 yyz219 于 2022-9-21 01:33 编辑
如果数据像你提供的那么规整的话,这样效率应当更高些:未经测试。
qixiaobin0715 发表于 2022-9-20 16:37
如果文件路径中有 “!”号的时候,被过滤掉了,能不能修改一下
下面是不能正确输出的1.csv
https://pan.baidu.com/s/1D0-KYijTpeT6mD2UXB3r-g
作者: yyz219 时间: 2022-9-20 22:33
回复 yyz219
直接在CMD窗口下试试如下指令:
hfxiang 发表于 2022-9-20 10:55
能够正确输出,麻烦修改为批处理
谢谢
作者: hfxiang 时间: 2022-9-21 08:23
for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:- @(for /f "tokens=10 delims=," %a in (1.csv) do @for /f %b in ('echo %~a^|findstr /i ".txt .ini .bat .vbs"') do @echo "%~b")>1.txt 2>nul
复制代码
在批处理用双百分号(%%),如下:- @(for /f "tokens=10 delims=," %%a in (1.csv) do @for /f %%b in ('echo %%~a^|findstr /i ".txt .ini .bat .vbs"') do @echo "%%~b")>1.txt 2>nul
复制代码
作者: yyz219 时间: 2022-9-21 08:25
for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:在批 ...
hfxiang 发表于 2022-9-21 08:23
非常感谢
作者: yyz219 时间: 2022-9-21 08:58
for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:在批 ...
hfxiang 发表于 2022-9-21 08:23
你这些代码比主楼的慢一些,能不能加快一点(或者修改一下主楼的代码,使它支持“!”号)
谢谢
作者: flashercs 时间: 2022-9-21 10:08
本帖最后由 flashercs 于 2022-9-21 10:14 编辑
- 0<1/*,:
- @echo off
- cd /d "%~dp0"
- cscript -nologo -e:jscript "%~f0" "1.csv" "1.txt"
- pause
- exit /b
- */;
- if (WScript.Arguments.length < 2) WScript.Quit();
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var re = /(?:")([^"]*\.(?:txt|ini|bat|vbs))[^"]*"$/igm;
- try {
- var tsread = fso.OpenTextFile(WScript.Arguments(0), 1, false, -2);
- var str = tsread.ReadAll();
- tsread.Close();
- var tswrite = fso.OpenTextFile(WScript.Arguments(1), 2, true, -2);
- var arr;
- while (null != (arr = re.exec(str))) {
- tswrite.WriteLine(arr[1]);
- }
- tswrite.Close();
- } catch (e) {
-
- }
复制代码
作者: qixiaobin0715 时间: 2022-9-21 10:16
回复 16# yyz219
那就去掉变量延迟:- @echo off
- (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
- for /f tokens^=17^ delims^=^" %%j in (%%i) do (
- for /f "delims=-" %%k in ("%%j") do echo,%%k
- )
- ))>1.txt
- pause
复制代码
作者: yyz219 时间: 2022-9-21 10:32
回复 yyz219
那就去掉变量延迟:
qixiaobin0715 发表于 2022-9-21 10:16
辛苦了 谢谢
作者: yyz219 时间: 2022-9-21 10:37
回复 yyz219
那就去掉变量延迟:
qixiaobin0715 发表于 2022-9-21 10:16
非常成功,非常感谢
作者: hfxiang 时间: 2022-9-21 10:42
本帖最后由 hfxiang 于 2022-9-21 10:45 编辑
回复 20# yyz219
如果想快,建议用第3方式具gawk( http://bcn.bathome.net/tool/4.1.3/gawk.exe )- @(for /f "delims=" %%a in ('gawk -F"," "$10~/\.txt/||/\.ini/||/\.bat/||/\.vbs/{print $10}" 1.csv') do @for /f "delims=-" %%b in (%%a) do @echo %%b)>1.txt 2>nul
复制代码
作者: yyz219 时间: 2022-9-21 11:06
回复 yyz219
如果想快,建议用第3方式具gawk( )
hfxiang 发表于 2022-9-21 10:42
又多了一种方法,谢谢
作者: qixiaobin0715 时间: 2022-9-24 09:51
22楼代码化简为:- @echo off
- (for /f tokens^=17^ delims^=^" %%j in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
- for /f "delims=-" %%k in ("%%j") do echo,%%k
- ))>1.txt
- pause
复制代码
作者: qixiaobin0715 时间: 2022-9-24 10:05
如果文件扩展名都是4个字符(包括.),用一个for循环+变量延迟即可:- @echo off
- for /f tokens^=17^ delims^=^" %%j in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
- if "%%j"=="%%~fj" (
- set "Filen=%%~dpnj"
- ) else (
- set "Filen=%%~nj"
- )
- set "Extn=%%~xj"
- setlocal enabledelayedexpansion
- echo,!Filen!!Extn:~,4!
- endlocal
- )
- pause
复制代码
这个可以忽略,主要是自己想练练手。
作者: yyz219 时间: 2022-9-24 13:16
如果文件扩展名都是4个字符(包括.),用一个for循环+变量延迟即可:这个可以忽略,主要是自己想练练手。
qixiaobin0715 发表于 2022-9-24 10:05
乐于助人
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |