获取 .txt 的内容 - 批量处理 for 循环中的文件
Get content of .txt - file in a for-loop in batch
我正在使用批处理文件搜索某些文件,[0-9]_xxx.xyz
,并从它们的路径中提取子字符串。我想将这些子字符串放在我的 Oracle 数据库中的 table 中。
这是我的代码中执行上述任务的部分:
FOR /F "tokens=7,8,9,* delims=\" %%a in ('dir /B /S /A:-D "*_xxx.xyz"') do (
@echo insert into tab (a,b,c,d,e^) values ('0','%%a','%%c','%%~dpd%%a\%%b\%%c','Content xxx.txt'^); | sqlplus USER/PW@DB
)
我的问题是在循环中获取 .txt
文件的内容,(总是一行),并将其放入行 e
在我的 test_tab
中。 .txt
文件位于 %%~dpd%%a\%%b\%%c\xxx.txt
,每个目录始终只有一个 .txt
文件,[0-9]_xxx.xyz
也位于该目录中。
目录结构:
C:\Users\myuser\Desktop\Input\object_group01_object01_module_name01_module.BAT_TEMPLATE
C:\Users\myuser\Desktop\Input\object_group01_object01_module_name01_module.txt
如果第一个文件存在,我需要将它的数据写入数据库。我需要 .txt
文件的单行内容在我的 table 的字段中
我的数据库中的一行 table 必须如下所示:
0 || object_group || 1001_object || source (whole path c:\...\1001_module_name || first line of txt
1001
只是一个例子,每个模块递增。
有没有办法把.txt
的内容放到一个变量中,然后放到数据库中?
我可能会尝试在 PowerShell 中编写此代码,但如果您决定使用批处理脚本,那么这应该可以帮助您:
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%f in (`dir /s /b /a:-d *_xxx.xyz`) do (
set filename=%%f
echo !filename!
echo.
set break=
for /f "usebackq delims=" %%l in ("!filename!") do if not defined break (
set line=%%l
set break=yes
)
for /f "usebackq tokens=7,8,9,* delims=\" %%a in ('!filename!') do (
set "sql=insert into tab (a,b,c,d,e^) values ('0','%%a','%%c','%%~dpd%%a\%%b\%%c','!line!'^);"
echo !sql!
)
)
此处,for /f "usebackq delims=" %%l in ("!filename!")
读取文件line-wise。 usebackq
和双引号围绕 !filename!
的组合确保带空格的路径不会导致错误。
do if not defined break
在第一次迭代后停止循环,即它只读取一行。既然你说你的文件只包含一行,那么它更像是一种预防措施。
第三个循环然后将路径拆分为多个部分,这就是您已有的循环。
我正在使用批处理文件搜索某些文件,[0-9]_xxx.xyz
,并从它们的路径中提取子字符串。我想将这些子字符串放在我的 Oracle 数据库中的 table 中。
这是我的代码中执行上述任务的部分:
FOR /F "tokens=7,8,9,* delims=\" %%a in ('dir /B /S /A:-D "*_xxx.xyz"') do (
@echo insert into tab (a,b,c,d,e^) values ('0','%%a','%%c','%%~dpd%%a\%%b\%%c','Content xxx.txt'^); | sqlplus USER/PW@DB
)
我的问题是在循环中获取 .txt
文件的内容,(总是一行),并将其放入行 e
在我的 test_tab
中。 .txt
文件位于 %%~dpd%%a\%%b\%%c\xxx.txt
,每个目录始终只有一个 .txt
文件,[0-9]_xxx.xyz
也位于该目录中。
目录结构:
C:\Users\myuser\Desktop\Input\object_group01_object01_module_name01_module.BAT_TEMPLATE
C:\Users\myuser\Desktop\Input\object_group01_object01_module_name01_module.txt
如果第一个文件存在,我需要将它的数据写入数据库。我需要 .txt
文件的单行内容在我的 table 的字段中
我的数据库中的一行 table 必须如下所示:
0 || object_group || 1001_object || source (whole path c:\...\1001_module_name || first line of txt
1001
只是一个例子,每个模块递增。
有没有办法把.txt
的内容放到一个变量中,然后放到数据库中?
我可能会尝试在 PowerShell 中编写此代码,但如果您决定使用批处理脚本,那么这应该可以帮助您:
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%f in (`dir /s /b /a:-d *_xxx.xyz`) do (
set filename=%%f
echo !filename!
echo.
set break=
for /f "usebackq delims=" %%l in ("!filename!") do if not defined break (
set line=%%l
set break=yes
)
for /f "usebackq tokens=7,8,9,* delims=\" %%a in ('!filename!') do (
set "sql=insert into tab (a,b,c,d,e^) values ('0','%%a','%%c','%%~dpd%%a\%%b\%%c','!line!'^);"
echo !sql!
)
)
此处,for /f "usebackq delims=" %%l in ("!filename!")
读取文件line-wise。 usebackq
和双引号围绕 !filename!
的组合确保带空格的路径不会导致错误。
do if not defined break
在第一次迭代后停止循环,即它只读取一行。既然你说你的文件只包含一行,那么它更像是一种预防措施。
第三个循环然后将路径拆分为多个部分,这就是您已有的循环。