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

时间:2017-04-27 11:04:27

标签: windows batch-file

我找了很久,没找到问题的确切答案。 我有点批处理,所以也许我不明白,但这是我的问题:

我使用批处理文件对远程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

但它也不起作用......

3 个答案:

答案 0 :(得分:0)

创建文件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%

请注意,直接从提示执行和作为批处理文件的行是不同的。对于批处理行,metavariable(循环控制变量)%%x必须引用为%%x,如果从命令提示符执行,则%x必须引用for。由于从提示中重复执行包含numreturned的行没有意义(创建批处理文件更容易),我发布了批处理文件版本。如果需要,用户有责任根据提示进行调整。

%%a设置为 no (即未定义)

将文件读取到-,只选择使用空格作为分隔符的第一个标记(标记和删除的默认值)

-的第一行显示时(有10个numreturned个字符),请将-设置为某个值,以便定义它。

当下一行到达时,它不会是numreturned的行,但现在定义了:foundit,因此从分配行(计数)的数据并通过转到标签 public class abcController { [Authorization] public ActionResult findme() { var model = new Umbraco.Web.Models.RenderModel(CurrentPage); ViewData["abc"] = Umbraco; return View(model); } }

来终止循环

然后分析找到的值并做任何事情。

答案 1 :(得分:0)

所以,使用每个人都告诉我的一点,这就是答案:

@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

所以我首先连接到数据库并使用第一行中的答案创建result.txt。 然后我将第一行放在变量号中。 我摆脱了号码之前的所有空白区域。 最后,我创建了一个数值,在其中我放置了我的字符串并打印出来。

谢谢大家的回答:)

答案 2 :(得分:0)

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

@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