近在網上看到不少朋友在討論如何在WINDOWS下通過批處理腳本運行SQL的話題。在UNIX下的話,寫SHELL比WINDOWS下寫BAT要簡單的多,就不再多說了。
關于WINDOWS下如何編寫BAT文件,此文不做介紹。下面就以一個通過BAT腳本停止Oracle數據庫的過程來簡單的師范一下BAT和SQL腳本的結合.
第一步:先寫個BAT文件ctl_ora.bat,內容如下:
sqlplus /nolog @d:stop_ora.sql > ora.log
第二步:編寫停止Oracle的SQL腳本[stop_ora.sql],內容如下:
connect /as sysdba;
shutdown immediate;
exit;
第三步:測試.運行ctl_ora.bat文件
E:>sqlplus /nolog @d:stop_ora.sql 1>ora.log
檢查執行日志ora.log
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 6月 10 20:15:00 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已連接。
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
從 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 斷開
關于在BAT中執行其他的SQL腳本,大家只要照著改改就可以了。不再多說了
第一步:先寫個BAT文件ctl_ora.bat,內容如下:
關于在BAT中執行其他的SQL腳本,大家只要照著改改就可以了。不再多說了
---------------------------------------------------------------------
假如你把需要的SQL操作信息等均放入到一個SQL文件中,需要制作一個bat文件來執行這個sql文件,那么你的bat文件中,在sqlplus登錄語句后的信息不能換行,換行的話則執行登錄sqlplus后就不再運行后面的命令。
例如執行c盤根目錄下的一個sql文件:a.sql,你的bat批處理應該這么寫(注意sqlplus):
sqlplus username/password@instanceNname @c:/a.sql
當然,別忘記了在a.sql的最后加入:quit命令。
本文大致向讀者介紹了樓下幾點知識,希望在編寫bat腳本時候能夠幫到讀者,如果能夠有所啟迪,那就更好了。
筆者目前所在的開發團隊,由于一些限制,沒有相關的devOps實踐,所以也就沒持續集成、自動部署什么事了。很多時候,還是依靠人力手動擋操控,先運行諸如yarn build或者npm run build之類的npm script去構建相關的前端項目,然后選中dist文件夾,進行相關的壓縮,差一點的就直接命名dist.zip好一點的就帶上個時間方便回溯,比如app-202206012002.zip這種,然后打開相關的ftp工具,把壓縮好的包傳到遠程服務器上,最后在服務器上解壓,放到nginx指定的html目錄下,這一趟發版就算是齊活了。
這種模式比如就一個項目,那你要是能夠接受,時間也夠充裕那就這么搞吧,也無可厚非的。但是要是有好多個這種項目這么搞,真讓人嘔吐啊,好tm惡心啊,程序員本身在做的一件事情,應該是把一件繁瑣的或者說是復雜的事情簡單化,而不是隨波逐流,任由事情變得越來越復雜、以致到了最后不可控,那就太雞肋了。
Larry Wall(拉里 · 沃爾)曾經說過程序員的三大美德:懶惰,急切,傲慢(laziness, impatience, hubris)。樓上的做法顯然不是很尊重(懶惰)美德啊,于是我開始蠢蠢欲動地構思顛覆樓上的發布模式。
我物色到了好幾位選手,一位是bat選手,一位是cmd選手,還有js選手,py選手等等,經過相關的權衡,我最終選擇編寫bat(批處理)來解決樓上的問題。
第一個就是,我們在解決當前問題的時候,盡量不要引入一些新事物去增加問題本身的復雜度,基于樓上這件事本身就是敲敲命令行(包括你說壓縮、上傳,本質上不就是一條命令嘛),所以js選手、py選手pass。第二個就是,我們盡量要做的兼容性足夠好,bat和cmd用起來其實都差不多的,但你一定要深究它們,我理了下它們的區別大致是這樣子的
所以綜上所述,我最后選擇編寫一個dos批處理腳本來解決樓上的問題。
以上列舉的是常用的bat腳本知識,具體的建議讀者閱讀幫助文檔來進行了解相關的命令,這里就不再贅述。
這里的思路是讓用戶輸入對應的數字,然后講參數傳給execBuild方法執行相關的邏輯(構建打包,壓縮,上傳)
@echo off
setlocal enabledelayedexpansion
color 0A
@REM 中電匯融項目構建腳本,Zheng JiangTao(jiangt.zheng@sunyard.com)
chcp 65001
cls
cd /D %~dp0
echo ==========(∩??ω??)?-*?中電匯融項目構建腳本?*-?(??ω??∩)==========
:start
echo 中電匯融項目數字菜單:
echo 【1】app, 【2】biz, 【3】fin
echo.
echo 【4】app、biz, 【5】app、fin
echo.
echo 【6】biz、fin,【7】app、biz、fin,
echo.
echo 【0】退出
echo.
echo 請按提示輸入相應的數字進行相關的項目構建操作:
set /p input_source=
if !input_source!== 0 ( echo 退出成功 )
if !input_source!== 1 ( call :execBuild app )
if !input_source!== 2 ( call :execBuild biz )
if !input_source!== 3 ( call :execBuild fin )
if !input_source!== 4 ( call :execBuild app,biz )
if !input_source!== 5 ( call :execBuild app,fin )
if !input_source!== 6 ( call :execBuild biz,fin )
if !input_source!== 7 ( call :execBuild app,biz,fin )
echo ========*:??(?′?`)??:*中電匯融項目構建腳本*:??(?′?`)??:*========
:finish
exit /b
市面上常見的壓縮軟件有winRar、7-Zip等等,一個思路是設置對應安裝的軟件的bin目錄到環境變量,然后去查閱對應的API,執行相關的打包壓縮命令,但是問題就來了,你哪能知道用戶裝的是winRar還是7-Zip,還是360壓縮呢,所以你就需要寫一個兼容的方法來抹平這個問題,先去查找有沒有對應的文件目錄,有的話添加到環境變量,然后執行對應的壓縮命令,這樣子很繁瑣,萬一它一個也沒有裝呢?而且也違背了上面說的(懶惰)美德。
所以在這里,我們試圖通過windows自身的一些方法去壓縮文件,皇天不負趕路人,我在csdn上看到一篇帖子https://blog.csdn.net/d_r_l_t/article/details/100584748,于是我摸著這位大哥的文件壓縮過河,具體的讀者可以點開閱讀下,我這里就不再贅述了。
創建一個zip.vbs腳本
Set objArgs = WScript.Arguments
ZipFile = objArgs(0)
' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)
' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
zip.CopyHere(objArgs(i))
WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next
那么壓縮就簡單到執行一條命令就好了,例如:cscript ../zip.vbs dest.zip src
scp命令可以進行計算機間的文件傳輸,具體的例如 scp app-202206012112.zip root@122.51.52.169:/root/nginx/html-auxre/zdhr/app就是把app-202206012112.zip傳到服務器122.51.52.169的/root/nginx/html-auxre/zdhr/app目錄下,當然這里會讓你輸入密碼。
其實這里寫一個auth.bat腳本就好了,代碼如下:
@echo off
ssh-keygen -t rsa
cd C:\Users\%USERNAME%\.ssh
type id_rsa.pub >> authorized_keys
xcopy /Q/Y/F/S "C:\Users\%USERNAME%\.ssh\id_rsa.pub" ".\authorized_keys"
xcopy /Q/Y/F/S "C:\Users\%USERNAME%\.ssh\id_rsa.pub" ".\id_rsa.pub"
scp id_rsa.pub authorized_keys root@122.51.52.169:/root/.ssh
最后完整的代碼是這樣子的,圖中ip為了保密已經做了瞎寫處理,讀者可以拿去參考應用到自己或者公司的項目中(這里,如果是在一些國企、銀行單位,那批處理就很有用了,畢竟沒網.jpg)
@echo off
setlocal enabledelayedexpansion
color 0A
@REM 中電匯融項目構建腳本,Zheng JiangTao(jiangt.zheng@sunyard.com)
chcp 65001
cls
cd /D %~dp0
echo ==========(∩??ω??)?-*?中電匯融項目構建腳本?*-?(??ω??∩)==========
:start
echo 中電匯融項目數字菜單:
echo 【1】app, 【2】biz, 【3】fin
echo.
echo 【4】app、biz, 【5】app、fin
echo.
echo 【6】biz、fin,【7】app、biz、fin,
echo.
echo 【0】退出
echo.
echo 請按提示輸入相應的數字進行相關的項目構建操作:
set /p input_source=
if !input_source!== 0 ( echo 退出成功 )
if !input_source!== 1 ( call :execBuild app )
if !input_source!== 2 ( call :execBuild biz )
if !input_source!== 3 ( call :execBuild fin )
if !input_source!== 4 ( call :execBuild app,biz )
if !input_source!== 5 ( call :execBuild app,fin )
if !input_source!== 6 ( call :execBuild biz,fin )
if !input_source!== 7 ( call :execBuild app,biz,fin )
echo ========*:??(?′?`)??:*中電匯融項目構建腳本*:??(?′?`)??:*========
:finish
exit /b
:execBuild
setlocal
set exec_a=%~1
set exec_b=%~2
set exec_c=%~3
set prefix=NotePBL
set exec_a_src="%~dp0%prefix%-%exec_a%\dist"
set exec_b_src="%~dp0%prefix%-%exec_b%\dist"
set exec_c_src="%~dp0%prefix%-%exec_c%\dist"
set cur_date=%date:~3,4%%date:~8,2%%date:~11,2%%time:~0,2%%time:~3,2%%time:~6,2%
set exec_a_dist="%~dp0%prefix%-%exec_a%\%exec_a%-%cur_date%.zip"
set exec_b_dist="%~dp0%prefix%-%exec_b%\%exec_b%-%cur_date%.zip"
set exec_c_dist="%~dp0%prefix%-%exec_c%\%exec_a%-%cur_date%.zip"
if "%exec_a%" == "" (
@REM Do Nothing
) else (
echo "*:??(?′?`)??:*構建%prefix%-%exec_a%開始*:??(?′?`)??:*"
cd /D %~dp0\%prefix%-%exec_a%
call npm run build
echo "*:??(?′?`)??:*構建%prefix%-%exec_a%結束*:??(?′?`)??:*"
echo "*:??(?′?`)??:*%exec_a%-%cur_date%.zip開始打包*:??(?′?`)??:*"
call cscript ../zip.vbs %exec_a_dist% %exec_a_src%
echo "*:??(?′?`)??:*%exec_a%-%cur_date%.zip打包完成*:??(?′?`)??:*"
echo "*:??(?′?`)??:*上傳%prefix%-%exec_a%開始*:??(?′?`)??:*"
scp %exec_a%-%cur_date%.zip root@122.51.52.169:/root/nginx/html-auxre/zdhr/%exec_a%
echo "*:??(?′?`)??:*上傳%prefix%-%exec_a%結束*:??(?′?`)??:*"
)
if "%exec_b%" == "" (
@REM Do Nothing
) else (
echo "*:??(?′?`)??:*構建%prefix%-%exec_b%開始*:??(?′?`)??:*"
cd /D %~dp0\%prefix%-%exec_b%
call npm run build
echo "*:??(?′?`)??:*構建%prefix%-%exec_b%結束*:??(?′?`)??:*"
echo "*:??(?′?`)??:*%exec_b%-%cur_date%.zip開始打包*:??(?′?`)??:*"
call cscript ../zip.vbs %exec_b_dist% %exec_b_src%
echo "*:??(?′?`)??:*%exec_b%-%cur_date%.zip打包完成*:??(?′?`)??:*"
echo "*:??(?′?`)??:*上傳%prefix%-%exec_b%開始*:??(?′?`)??:*"
scp %exec_b%-%cur_date%.zip root@122.51.52.169:/root/nginx/html-auxre/zdhr/%exec_b%
echo "*:??(?′?`)??:*上傳%prefix%-%exec_b%結束*:??(?′?`)??:*"
)
if "%exec_c%" == "" (
@REM Do Nothing
) else (
echo "*:??(?′?`)??:*構建%prefix%-%exec_c%開始*:??(?′?`)??:*"
cd /D %~dp0\%prefix%-%exec_c%
call npm run build
echo "*:??(?′?`)??:*構建%prefix%-%exec_c%結束*:??(?′?`)??:*"
echo "*:??(?′?`)??:*%exec_c%-%cur_date%.zip開始打包*:??(?′?`)??:*"
call cscript ../zip.vbs %exec_c_dist% %exec_c_src%
echo "*:??(?′?`)??:*%exec_c%-%cur_date%.zip打包完成*:??(?′?`)??:*"
echo "*:??(?′?`)??:*上傳%prefix%-%exec_c%開始*:??(?′?`)??:*"
scp %exec_c%-%cur_date%.zip root@122.51.52.169:/root/nginx/html-auxre/zdhr/%exec_c%
echo "*:??(?′?`)??:*上傳%prefix%-%exec_c%結束*:??(?′?`)??:*"
)
goto:eof
可能細心的讀者會發現,怎么沒有構建這一步啊,這里為了更直觀的讓大家看到效果,我在運行的時候把npm run build 注釋掉了因為它打出來的日志太多了,刷屏了,就把它去掉,展示下整體的效果,圖中應該是壓縮到上傳到Linux服務器的效果
樓上的腳本就作為拋磚引玉,希望能夠在前端發包方面幫助到讀者,解放勞動力。其實我們還是可以繼續優化的,比如說,在CPU和內存理想的狀態下,我能不能開三個小窗口去分別并行執行三個項目的構建,然后把項目的構建和上傳解耦,這樣子設計會更符合軟件設計的思想,更加魯棒。
文章來自https://www.cnblogs.com/cnroadbridge/p/16336280.html
、以windows下備份sql數據庫為例,開機自動執行.bat腳本
1、新建dump.bat文件,文件中的代碼如下:
set YYYYmmdd=%date:~0,4%%date:~5,2%%date:~8,2%
set "filename=test%YYYYmmdd%.sql"
echo %filename%
mysqldump -uroot -proot --databases database >D:\%filename%
參數詳解:
YYYYmmdd 設置系統時間,以年月日為例
filename 備份后的.sql文件名,例:test20180410.sql
-uroot 配置數據庫連接用戶名
-proot 配置數據連接密碼
database 需要備份的數據庫名稱
2、把dump.bat文件放入C:\Users\root\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup目錄 下,如下圖所示:其中AppData為隱藏目錄,就能夠開機時自動執行腳本里的內容了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。