[英]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.