Windows 批量从文本文件中获取特定字符串

Windows 批量从文本文件中获取特定字符串,windows,batch-file,Windows,Batch File,我找了很长时间,没有找到我问题的确切答案。 我对batch有点陌生,所以可能我不明白,但我的问题是: 我使用批处理文件对远程oracle数据库执行sql查询,其中包括: @echo @ScriptToExecute.sql | sqlplus username/password@database > result.txt 答案被写入result.txt,如下所示: -- assumed empty -- SQL*Plus: Release 9.2.0.1.0 - Production o

我找了很长时间,没有找到我问题的确切答案。 我对batch有点陌生,所以可能我不明白,但我的问题是:

我使用批处理文件对远程oracle数据库执行sql查询,其中包括:

@echo @ScriptToExecute.sql | sqlplus username/password@database > result.txt
答案被写入result.txt,如下所示:

-- assumed empty --
SQL*Plus: Release 9.2.0.1.0 - Production on Je Avr 27 12:34:34 2017

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connecté à :
Oracle9i Release 9.2.0.6.0 - Production
JServer Release 9.2.0.6.0 - Production

SQL>
  COUNT(*)
----------
        13

SQL>Déconnecté de Oracle9i Release 9.2.0.6.0 - Production
JServer Release 9.2.0.6.0 - Production
我想要的是打开这个文本文件并输入一个变量13。 当然,这样做的目的是每天执行一次批处理文件,以确保答案仍然是13。 最后,批处理文件必须返回查询答案的编号

我想要的答案在第14行

有什么想法吗

谢谢你的回复

编辑:我尝试了很多方法,比如使用powershell命令来使用我以前在shell中知道的head和tail命令,但我没有使用powershell。 我还尝试使用sqlcmd,它可以过滤结果,但它必须安装,我不能在不同的主机上安装任何东西。 我尝试通过以下方式使用命令
more+13

@echo @ScriptToExecute.sql | sqlplus username/password@database > more +13 result.txt

但是它也不起作用…

一旦您创建了文件
result.txt

set "numreturned="
for /f %%a in (result.txt) do if "%%a"=="----------" (
 set "numreturned=%%a"
 ) else if defined numreturned set /a numreturned=%%a&goto foundit
:foundit
echo number returned=%numreturned%
或者,如果您不想创建
result.txt

set "numreturned="
for /f %%a in (
 'echo ScriptToExecute.sql ^| sqlplus username/password@database'
) do if "%%a"=="----------" (
 set "numreturned=%%a"
 ) else if defined numreturned set /a numreturned=%%a&goto foundit
:foundit
echo number returned=%numreturned%
请注意,直接从提示符执行和作为批处理文件的行执行是不同的。如果从命令提示符执行,
元变量(循环控制变量)
%%x
必须被引用为批处理行的
%%x
,并且
%x
。由于在提示符下重复执行包含
行没有什么意义(创建批处理文件更容易),因此我发布了批处理文件版本。如果需要,用户有责任调整直接从提示

已将
numreturned
设置为nothing(即未定义)

将文件读取到
%%a
,仅选择第一个标记,使用空格作为分隔符(标记和delims的默认值)

当出现
-
的第一行时(有10个
-
字符),将
numreturned
设置为某个值,以便对其进行定义

当下一行到达时,它将不是
-
的一行,但是
numreturned
现在已定义,因此从该行分配数据(计数),并通过转到标签
:foundit
终止循环


然后分析发现的价值,然后做任何事情。

因此,利用大家告诉我的一点,下面是答案:

@echo @ScriptToExecute.sql | sqlplus username/password@database | more 
+13 > result.txt
set /p "number=" < result.txt
set number=%number: =%
set /A newnumber=%number
echo %newnumber%:ok
@echo@ScriptToExecute.sql | sqlplus用户名/password@database|更多
+13>result.txt
设置/p“number=“
所以我首先连接到数据库并创建result.txt,答案在第一行。 然后我把这第一行放在变量中。 在我的号码之前,我把所有的空格都去掉了。 最后,我创建一个数值,在其中放入字符串并打印它


谢谢大家的回答:)

根据您的新评论,此方法应该有效:

@echo off

echo @ScriptToExecute.sql | sqlplus username/password@database | more +13 > result.txt
for /F %%a in (result.txt) do set "number=%%a" & goto continue
:continue
echo %number%:ok
您也可以这样尝试,即不创建任何其他文件:

@echo off

for /F "skip=13" %%a in ('echo @ScriptToExecute.sql ^| sqlplus username/password@database') do (
   set "number=%%a" & goto continue
)
:continue
echo %number%:ok

我建议您做的第一件事是减少答案,我知道Oracle配置中有一些东西,如
设置标题关闭
设置反馈关闭
(或类似),这将大大减少SQL结果,并使您更容易解析。除此之外,您还可以向SQL查询中添加类似“RESULT=”的内容。当您在
RESULT=
上执行
findstr
(或
grep
)时,解析SQL结果可能会容易得多。这可能会有所帮助,
findstr/RXC:[][]*[0-9]*”result.txt
?我将尝试在Dominique上减少它,但我担心在我找到在文本文件中选择精确行的方法之前它不会起作用:/我的代码是读取result.txt文件;它应该在您指定的工作命令行下面的新行上@我用你的代码尝试了各种方法,但它似乎无法识别。我试着把它放在另一个文本文件或变量中,或只是在屏幕上打印,但什么都不起作用:/我真的认为那会起作用,但。。。没有。它似乎只读取每行的第一个字符串。所以它读了
SQL*Plus:
然后是
版权
等等。不幸的是,在我们感兴趣的线路上,我们想要的号码前有一个空格,所以。。。它永远达不到数字:/n你知道如何纠正这个问题吗?下面是我得到的代码:但是感谢@Magoo,我仍然有点接近答案,
for/f
的默认分隔符包括空格,应该忽略前导分隔符。您可以尝试添加
“delims=“
”,但它应该没有效果。我必须得出的结论是,该行上的字符不是空格——这就是为什么首选源数据的剪切粘贴。如果将数字前面的字符串剪切并粘贴到
delims
子句中,那么如果该字符串莫名其妙地不是空格,则应该可以解决问题。