2015-11-23 86 views
3

我想通過以下查詢到sqlplus命令。如何在批處理文件中回顯特殊字符?

select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13) || CHR(10)||'Status: ' || a1.STORAGE_STATUS || CHR(13) || CHR(10)|| 'Distribution ID: ' || a1.DISTRIBUTION_ID FROM epc1_distrib_version a1; 

當我使用插入符號^簽署它運作良好,這個呼應在屏幕上。

echo select 'Version ID: ' ^|^| a1.BACKUP_VERSION ^|^| CHR(13) ^|^| CHR(10)^|^|'Status: ' ^|^| a1.STORAGE_STATUS ^|^| CHR(13) ^|^| CHR(10)^|^| 'Distribution ID: ' ^|^| a1.DISTRIBUTION_ID FROM epc1_distrib_version a1; 

它顯示正確的查詢字符串。但是當我在批處理文件中使用它時,它不起作用。這是代碼我試圖運行:

@ECHO OFF 
echo Connecting to Database... 
echo +++++++++++++++++++++++++ 
(
echo user/[email protected] 
echo select 'Version ID: ' ^|^| a1.BACKUP_VERSION ^|^| CHR(13) ^|^| CHR(10)^|^|'Status: ' ^|^| a1.STORAGE_STATUS ^|^| CHR(13) ^|^| CHR(10)^|^| 'Distribution ID: ' ^|^| a1.DISTRIBUTION_ID FROM epc1_distrib_version a1; 
)| sqlplus -s 
echo +++++++++++++++++++++++++ 

那隻能說明這一點:

Connecting to Database... 
+++++++++++++++++++++++++ 
user/[email protected] 
select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13 
+++++++++++++++++++++++++ 

它不通過查詢sqlplus命令,如何做到這一點?

回答

3

您需要跳過像^)這樣的右括號。您的echo命令放置在一對括號之間的代碼塊中();任何非轉義的右括號都被解釋爲該塊的結尾。因此,固定的代碼如下所示:

echo select 'Version ID: ' ^|^| a1.BACKUP_VERSION ^|^| CHR^(13^) ^|^| CHR^(10^)^|^|'Status: ' ^|^| a1.STORAGE_STATUS ^|^| CHR^(13^) ^|^| CHR^(10^)^|^| 'Distribution ID: ' ^|^| a1.DISTRIBUTION_ID FROM epc1_distrib_version a1; 

我躲過了左括號^(爲好,雖然這不是絕對必要的,對於代碼的可讀性的緣故;所以很清楚哪個括號是功能性的,哪個是美觀的。

在批處理腳本中,您使用管道|將輸出傳遞給sqlplus命令;這需要雙逸出這樣的:

@echo off 
echo Connecting to Database... 
echo +++++++++++++++++++++++++ 
(
echo user/[email protected] 
echo select 'Version ID: ' ^^^|^^^| a1.BACKUP_VERSION ^^^|^^^| CHR^^^(13^^^) ^^^|^^^| CHR^^^(10^^^)^^^|^^^|'Status: ' ^^^|^^^| a1.STORAGE_STATUS ^^^|^^^| CHR^^^(13^^^) ^^^|^^^| CHR^^^(10^^^)^^^|^^^| 'Distribution ID: ' ^^^|^^^| a1.DISTRIBUTION_ID FROM epc1_distrib_version a1; 
) | sqlplus -s 
echo +++++++++++++++++++++++++ 

這是因爲管創建的|每一側,其中執行代碼部分新的命令提示符實例;因此需要從運行批處理文件的主命令提示符實例中隱藏特殊字符,並形成由管道進程創建的實例。


另一種選擇是一對雙引號""(假設字符串本身不包含這樣的字符)的放置串以輸出betweeen。但是,不能使用像echo "..."這樣的命令行,因爲輸出中包含"",這是我們不想要的。

一個竅門是使用set /P,它旨在提示用戶輸入環境變量的值。我們不需要變量(#)這裏,但提示文字:

set /P "#=select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13) || CHR(10)||'Status: ' || a1.STORAGE_STATUS || CHR(13) || CHR(10)|| 'Distribution ID: ' || a1.DISTRIBUTION_ID FROM epc1_distrib_version a1;" 

爲了避免這種命令等待用戶輸入的,我們管的echo到它(只是一個單一_字符):

echo _| set /P "#=select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13) || CHR(10)||'Status: ' || a1.STORAGE_STATUS || CHR(13) || CHR(10)|| 'Distribution ID: ' || a1.DISTRIBUTION_ID FROM epc1_distrib_version a1;" 

最後,讓我們用這一切的批處理腳本:

@echo off 
echo Connecting to Database... 
echo +++++++++++++++++++++++++ 
(
echo user/[email protected] 
echo _| set /P "#=select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13) || CHR(10)||'Status: ' || a1.STORAGE_STATUS || CHR(13) || CHR(10)|| 'Distribution ID: ' || a1.DISTRIBUTION_ID FROM epc1_distrib_version a1;" 
echo/ 
) | sqlplus -s 
echo +++++++++++++++++++++++++ 

反對以echo,由顯示的文本不會被最終換行符終止;這就是爲什麼我插入了輸出一個換行符的行echo/

+0

不工作。不顯示結果 – user2400582

+1

它的工作原理,但只有沒有管道'|',我忘了,抱歉;看我的編輯... – aschipfl

+1

我剛剛添加了一個替代方法,使用'set/P'和'「」';這樣可以避免(雙)轉義的需要... – aschipfl

2

您可以使用插入符,但是當您想要插入它時,則需要兩次轉義每個特殊字符,並用引號將整個事件討厭。

你可以使用延遲擴展來避免這種

set "sql=select 'Version ID: ' || a1.BACKUP_VERSION || CHR(13) || CHR(10)||'Status: ' || a1.STORAGE_STATUS || CHR(13) || CHR(10)|| 'Distribution ID: ' || a1.DISTRIBUTION_ID FROM epc1_distrib_version a1;" 

(
    echo user/[email protected] 
    cmd /v:on /c "echo ^!sql^!" 
) | sqlplus -s 

順便說一句。要測試您的轉義,您可以用more替換sqlplus以查看您真正迴應的內容

相關問題