整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          WINDOWS下通過BAT文件執行SQL示例-jsustchenjin

          近在網上看到不少朋友在討論如何在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腳本時候能夠幫到讀者,如果能夠有所啟迪,那就更好了。

          • bat腳本的相關知識和案例編寫
          • 用windows自帶的命令壓縮文件
          • windows和linux文件傳輸
          • 如何免密碼登錄Linux
          • 前端發布流程的優化

          背景介紹

          筆者目前所在的開發團隊,由于一些限制,沒有相關的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(批處理)來解決樓上的問題。

          我為什么相中bat選手來解決樓上的問題?

          第一個就是,我們在解決當前問題的時候,盡量不要引入一些新事物去增加問題本身的復雜度,基于樓上這件事本身就是敲敲命令行(包括你說壓縮、上傳,本質上不就是一條命令嘛),所以js選手、py選手pass。第二個就是,我們盡量要做的兼容性足夠好,bat和cmd用起來其實都差不多的,但你一定要深究它們,我理了下它們的區別大致是這樣子的

          • bat(ms dos批處理腳本)基于dos設計,更通用一點
          • cmd(windows nt命令腳本)只能在windows2000以上系統運行,但是命令豐富

          所以綜上所述,我最后選擇編寫一個dos批處理腳本來解決樓上的問題。

          有哪些人機交互的方案可以實現?

          • 方案一:當用戶運行相關bat腳本的時候,可以讓用戶輸入對應的項目名稱,然后去匹配對應的項目,再執行構建命令,然后執行壓縮命令,再上傳到linux服務器
          • 方案二:考慮到項目有可能很長,為了優化用戶體驗,現在統一讓用戶輸入數字,執行相關的邏輯,比如1、執行app項目構建,2、執行biz項目構建,3、執行app和biz項目構建,然后在進行相關的壓縮上傳操作。
          • 把項目的粒度放到子項目中去,比如NoteWeb下面有app,biz,fin三個子項目,每個子項目寫一個構建腳本,在父項目中,寫的著急一點就無腦構建,每個項目都run一把,當然你也可以參考樓上的方案一、二做相應的優化

          bat腳本知識科普

          • @echo off 關閉回顯
          • setlocal enabledelayedexpansion 設置延遲變量
          • @REM 用來寫注釋的
          • chcp 65001 使用utf-8編碼,這樣中文就不會亂碼了,
          • cls 清屏
          • cd /D %~dp0 進入當前目錄
          • echo 這個是用來輸出的
          • color 0A 設置文字顯示的顏色是 一抹“原諒色”
          • set /p input_source= 講輸入的值賦值給變量input_source

          以上列舉的是常用的bat腳本知識,具體的建議讀者閱讀幫助文檔來進行了解相關的命令,這里就不再贅述。

          deploy.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

          如何上傳到linux服務器?

          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目錄下,當然這里會讓你輸入密碼。

          如何解決每次執行scp命令都要輸入密碼(解決免密登錄)?

          其實這里寫一個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為隱藏目錄,就能夠開機時自動執行腳本里的內容了。


          主站蜘蛛池模板: 国产精品一区二区毛卡片| 国产亚洲自拍一区| 日韩免费无码视频一区二区三区 | jazzjazz国产精品一区二区| 秋霞午夜一区二区| 成人在线一区二区| 国产伦精品一区二区三区四区| 国精产品一区二区三区糖心| 亚洲一区在线观看视频| 亚洲日韩激情无码一区| 日本高清无卡码一区二区久久 | 一区二区无码免费视频网站| 99精品国产高清一区二区三区| 精品视频午夜一区二区| 国产成人精品一区二三区熟女| 成人精品一区二区户外勾搭野战 | 亚洲制服丝袜一区二区三区| 日韩一本之道一区中文字幕| 青娱乐国产官网极品一区| 波多野结衣在线观看一区| 人妻少妇精品视频三区二区一区| 亚洲天堂一区二区三区| 精品无码人妻一区二区三区| 亚洲国产精品一区第二页| 欧洲精品码一区二区三区免费看| 91一区二区三区四区五区| 91精品一区二区| 毛片一区二区三区无码| 国产精品一区视频| 波多野结衣AV一区二区三区中文| 亚洲乱码一区二区三区国产精品| 99久久人妻精品免费一区| 国产吧一区在线视频| 亚洲AV日韩综合一区尤物| 亚洲熟妇无码一区二区三区导航| 久久毛片一区二区| 亚洲综合一区二区国产精品| ...91久久精品一区二区三区| 少妇激情一区二区三区视频 | 69福利视频一区二区| 色婷婷一区二区三区四区成人网|