在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%部分是我的问题所在?它没有一次采取多个变量
答案 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
注意:由于延迟扩展,您的数据不应包含感叹号(!
)。