簡體   English   中英

從文本文件中批量獲取特定字符串

[英]Get a specific string from a text file in 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%

請注意,直接從提示符處執行和帶有批處理文件的行是不同的。 所述metavariable (循環控制變量) %%x必須以引用%%x為一批線和%x如果從命令提示來執行。 由於從提示重復執行包含for的行幾乎沒有意義(創建批處理文件更容易),因此我發布了批處理文件版本。 如果需要,用戶有責任根據提示進行直接調整。

設置numreturned (即未定義)

將文件讀取到%%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

因此,我首先連接到數據庫,並在第一行中使用答案創建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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM