如何在文本文件中搜索字符串(行)的特定部分,然后将其插入变量?

时间:2017-04-20 08:30:56

标签: windows bash batch-file full-text-search

在Windows上使用BATCH / BASH: 我想知道如何逐行搜索文本文件(.txt),因为每一行都是它自己的字符串,查找位置目录(例如,C:... ),这是这个字符串的一部分。然后取出特定的部分并存储在变量中。

虽然这是为每一行做的。

任何帮助都将不胜感激。

TestRecID TestUserID 5 2017-04-20 TestTAtRec No 2.560 No C:\Test1\Test3 Tester
TestRecID TestUserID 5 2017-04-20 TestTAtRec No 2.560 No C:\Test2\Test2 Tester
TestRecID TestUserID 5 2017-04-20 TestTAtRec No 2.560 No C:\Test3\Test1 Tester

假设上面是文本文件中的每一行。 在行中的每个空格处,不同的列将在DB中。

预期结果将是:

C:\Test1\Test3 --> Variable 1
C:\Test2\Test2 --> Variable 2
C:\Test3\Test1 --> Variable n

存储在某个变量中。

我真的不能夸大我用于Windows的Batch / Bash有多少新手

跟进问题:

for /f "tokens=9 delims= " %%a in (%findfile%) do echo %%a 

我想将%% a存储在variable_name

我认为这是一个例子:

for /f "tokens=9 delims= " %%a in (%findfile%) do echo %%a
set variable_name = %%a

但它不起作用?

回答了,但是我在答案中被问到了一个问题,

答案:

for /f "tokens=9 delims= " %%b in (%findfile%) do set "location=%%b"

修改 采用独特变量的工作循环(感谢@Stephen):

REM Get Locations from textfile:
for /f "skip=1 tokens=9 delims= " %%a in (%findfile%) do set "_%%a=yes"
REM Translate into proper variables:
set count = 0
for /f "tokens=1* delims==#" %%a in ('set _') do (
    set /a count+=1
    set _location[%count%]=%%a
)
set _location

这是我正在使用的FFMPEG功能,但我现在需要它分别接收每个变量:

for %%i in (%_location%\*.mp4) do (if not exist "%%~ni\" MD "%%~ni"
    ffmpeg -i "%%i" -vframes 1 -f image2 -start_number 0 "%%~ni\%%~ni_Summary_%%3d.jpeg"
)

上面函数中的%_location%部分是我的问题所在?它没有一次采取多个变量

1 个答案:

答案 0 :(得分:1)

由于将整个输出存储到一个变量中是没有意义的,我假设,你想要一个变量用于每行

@echo off
setlocal EnableDelayedExpansion
set n=0
for /f "tokens=9" %%a in (file.txt) do (
  set /a n+=1
  set _Var[!n!]=%%a
)
set _Var[

注意do之后的parantheses。这称为代码块,并且像单个命令一样被解析和执行。 (这就是你需要delayed expansion)的原因。

编辑要删除重复项,您可以使用大量代码将(可能)新数据与每个已存在的变量进行比较,或者使用一个奇怪的技巧:将数据用作变量名称(以及一些虚拟字符串作为值),因此每个副本只会“覆盖”已存在的变量,并在第二步中将数据(现在变量名称)作为值放入变量中。

@echo off 
SetLocal EnableDelayedExpansion
REM clear variables:
for /f "delims==" %%a in ('set _') do set "%%a="
REM get locations from textfile:
for /f "tokens=9" %%a in (file.txt) do set "_%%a=yes"

REM translate into proper variables:
set count=0
echo on
for /f "tokens=1* delims==#" %%a in ('set _') do (
  set /a count+=1
  set x=%%a
  set _var[!count!]=!x:~1!
)
set _var

注意:由于延迟扩展,您的数据不应包含感叹号(!)。