关于脚本:linux下依赖库的拷贝脚本

#!/bin/sh# 可执行程序名app_name="qtdemo"# 指标文件夹dst="./app"# 利用 ldd 提取依赖库的具体门路liblist=$(ldd $app_name | awk '{ if (match($3,"/")){ printf("%s "), $3 } }')# 指标文件夹的检测if [ ! -d $dst ];then mkdir $dstfi# 拷贝库文件和可执行程序到指标文件夹cp $liblist $dstcp $app_name $dst

April 4, 2023 · 1 min · jiezi

关于脚本:基于dos与shell-实现数据库批量跑库脚本dmmysql

bat mysql跑库@echo offchcp 65001%~d0cd %~dp0set basepath=%~dp0set | findstr mysqlif "%ERRORLEVEL%" == "0" ( goto paraminit) ELSE ECHO THERE IS NOT MYSQL ENV !goto end:paraminitset /p mysqlhost="ip 地址,默认值 ==> (127.0.0.1) : "set /p mysqlport="请输出mysql服务端口,默认值 ==> (3306) :"set /p rootpwd="请输出mysql超管明码,默认值 ==> (root) :"set /p kupwd="请输出oneaccess各个库拥有者对应的明码,默认值 ==> (Bamboocloud@1234) : "set /p suffix="请输出oneaccess对应的库及用户的后缀,默认为空串: "if "%mysqlhost%"=="" set mysqlhost=127.0.0.1if "%mysqlport%"=="" set mysqlport=3306if "%rootpwd%"=="" set rootpwd=rootif "%kupwd%"=="" set kupwd=Bamboocloud@1234if "%suffix%"=="" set suffix=set sql_dir=sql_cmd_executermdir /s/q %basepath%\%sql_dir%mkdir -p %basepath%\%sql_dir% xcopy /y/e/i %basepath%\bam %basepath%\%sql_dir% xcopy /y/e/i %basepath%\bim %basepath%\%sql_dir% xcopy /y/e/i %basepath%\epass %basepath%\%sql_dir% xcopy /y/e/i %basepath%\apphub %basepath%\%sql_dir% goto replacepwdfohcs:replacepwdfohcs@setlocal enabledelayedexpansionfor /f "delims=" %%i in (%basepath%\%sql_dir%\bam_mysql_db_create.sql) do (set content=%%iset content=!content:bam_password=abcdefghijklmnopqrst!set content=!content:bam=bam%suffix%!set content=!content:abcdefghijklmnopqrst=%kupwd%!echo !content!>>$1)move $1 %basepath%\%sql_dir%\bam_mysql_db_create.sql || EXIT \Bfor /f "delims=" %%i in (%basepath%\%sql_dir%\bim_mysql_db_create.sql) do (set content=%%iset content=!content:bim_password=abcdefghijklmnopqrst!set content=!content:bim=bim%suffix%!set content=!content:abcdefghijklmnopqrst=%kupwd%!echo !content!>>$2)move $2 %basepath%\%sql_dir%\bim_mysql_db_create.sql || EXIT \Bfor /f "delims=" %%i in (%basepath%\%sql_dir%\apphub_mysql_db_create.sql) do (set content=%%iset content=!content:apphub_password=abcdefghijklmnopqrst!set content=!content:apphub=apphub%suffix%!set content=!content:abcdefghijklmnopqrst=%kupwd%!echo !content!>>$3)move $3 %basepath%\%sql_dir%\apphub_mysql_db_create.sql || EXIT \Bfor /f "delims=" %%i in (%basepath%\%sql_dir%\epass_mysql_db_create.sql) do (set content=%%iset content=!content:epass_password=abcdefghijklmnopqrst!set content=!content:epass=epass%suffix%!set content=!content:abcdefghijklmnopqrst=%kupwd%!echo !content!>>$4)move $4 %basepath%\%sql_dir%\epass_mysql_db_create.sql || EXIT \Bgoto mysqlsqlexec:mysqlsqlexecset _timeTemp=0call:GetTimeSeconds %time%set time1=%_timeTemp%rem choice 期待5秒 再计算另外一个工夫点 mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "mysql" < %basepath%\%sql_dir%\bam_mysql_db_create.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "mysql" < %basepath%\%sql_dir%\bim_mysql_db_create.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "mysql" < %basepath%\%sql_dir%\apphub_mysql_db_create.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "mysql" < %basepath%\%sql_dir%\epass_mysql_db_create.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "bam%suffix%" < %basepath%\%sql_dir%\bam\bam_mysql_table_and_data.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "bim%suffix%" < %basepath%\%sql_dir%\bim_mysql_table_and_data.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "apphub%suffix%" < %basepath%\%sql_dir%\apphub_mysql_table_and_data.sql -vvv mysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -D "epass%suffix%" < %basepath%\%sql_dir%\epass_mysql_table_and_data.sql -vvv@echo off@REM "goto printexetimes:printexetimescall:GetTimeSeconds %time%set time2=%_timeTemp%set /a interTime=%time2% - %time1%echo echo 已全量跑库实现 hcs_mysql_bat 耗时: %interTime% 秒 !!goto end:GetTimeSecondsset tt=%1rem windows下%time%工夫的格局个别为hour:minute:second.number 上面两行只是去掉冒号和顿号变成hour minute second number ,此处只是取hour minute secondset tt=%tt:.= %set tt=%tt::= %set index=1for %%a in (%tt%) do ( if !index! EQU 1 ( set hh=%%a )^ else if !index! EQU 2 ( set mm=%%a )^ else if !index! EQU 3 ( set ss=%%a )set /a index=index+1)set /a _timeTemp=(%hh%*60+%mm%)*60+%ss%goto:end:endmysql删库@echo offchcp 65001set | findstr mysqlif "%ERRORLEVEL%" == "0" (goto paraminit)echo there is no mysql envgoto end:paraminitset /p mysqlhost="请输出ip:"set /p mysqlport=请输出端口set /p rootpwd=请输出明码set /p suffix=请输出后缀if "%mysqlhost%"=="" set mysqlhost=127.0.0.1if "%mysqlport%"=="" set mysqlport=3306if "%rootpwd%"=="" set rootpwd=rootif "%suffix%"=="" set suffix=136goto mysqldelexec:mysqldelexecmysql -h %mysqlhost% -uroot -p%rootpwd% -P %mysqlport% -e "use mysql;DROP USER IF EXISTS 'bam%suffix%'@'%%';DROP USER IF EXISTS 'bam%suffix%'@'localhost';DROP DATABASE IF EXISTS `bam%suffix%`;DROP USER IF EXISTS 'bim%suffix%'@'%%';DROP USER IF EXISTS 'bim%suffix%'@'localhost';DROP DATABASE IF EXISTS `bim%suffix%`;DROP USER IF EXISTS 'apphub%suffix%'@'%%';DROP USER IF EXISTS 'apphub%suffix%'@'localhost';DROP DATABASE IF EXISTS `apphub%suffix%`;DROP USER IF EXISTS 'epass%suffix%'@'%%';DROP USER IF EXISTS 'epass%suffix%'@'localhost';DROP DATABASE IF EXISTS `epass%suffix%`;" -vvvgoto end:endpausebash ...

January 16, 2023 · 5 min · jiezi

关于脚本:PythonSeaTable-从数字文本列生成条形码图片并写入表格

不论是录入信息时须要用扫码器扫码录入、核查信息时用于扫码辨认,还是有别的生成条形码的须要,那咱们如何把表格中的数字、文本列疾速生成条形码图片呢?这在 SeaTable 表格中用 Python 脚本就能够轻松实现,即把表格中的某一个字段,如身份证号、电话号转换成相应的条形码,并存储到图片列中。例如,你有如下一张表格,外面有电话号码和条码图片两列,须要把每一行的电话号码转换成条码,并传到条码图片(BarcodeImage)列中去。怎么实现呢? 在 SeaTable 中用 Python 生成条形码新建 Python 脚本首先须要在表格中,点击“脚本”性能,新建一个 Python 脚本。 写入代码而后在脚本中写入如下代码(如果须要线下运行,须要装置Python-barcode 依赖包) import osimport timeimport barcodefrom barcode.writer import ImageWriterfrom seatable_api import Base, contextapi_token = context.api_token or "859ad340d9a2b11b067c11f43078992e14853af5"server_url = context.server_url or "https://cloud.seatable.cn"TEXT_COL = "PhoneNum" # 须要转换成条码的列BARCODE_IMAGE_COL = "BarcodeImage" # 图片列, 存储条码TABLE_NAME = 'Table1'BARCODE_TYPE = 'code128'CUSTOM_OPTIONS = { "module_width": 0.2, # 单个条纹的最小宽度, mm "module_height": 15.0, # 条纹带的高度, mm "quiet_zone": 6.5, # 图片两边与首尾两条纹之间的间隔, mm "font_size": 10, # 条纹底部文本的大小,pt "text_distance": 5.0, # 条纹底部与条纹之间的间隔, mm}CODE = barcode.get_barcode_class(BARCODE_TYPE)base = Base(api_token, server_url)base.auth()def get_time_stamp(): return str(int(time.time()*100000))for row in base.list_rows(TABLE_NAME): # 如果图片列中已有内容, 则跳过 if row.get(BARCODE_IMAGE_COL): continue # 如果电话号码列为空,则跳过 if not row.get(TEXT_COL): continue try: row_id = row.get('_id') msg = str(row.get(TEXT_COL)) # 生成条码对象 code_img = CODE(msg, writer=ImageWriter()) save_name = "%s_%s" % (row_id, get_time_stamp()) # 保留为图片并暂存 file_name = code_img.save("/tmp/%s" % save_name, options=CUSTOM_OPTIONS) # 将图片上传至 Base 表格 info_dict = base.upload_local_file(file_name, name=None, file_type='image', replace=True) img_url = info_dict.get('url') row[BARCODE_IMAGE_COL] = [img_url] base.update_row('Table1', row_id, row) # 移除暂存文件 os.remove(file_name) except Exception as error: print("error occured during barcode generate", error) continue运行脚本一键点击运行按钮,脚本运行实现后,表格中的电话号就会主动生成相应的条形码,并保留到条形码图片列。方便快捷。 ...

July 29, 2022 · 1 min · jiezi

关于脚本:测试-split-计时-shell-脚本参考

测试 split 计时 shell 脚本参考#!/bin/bash# set -euxo#如果是一个新的环境,则须要设置变量TEST_ENV="new"TEST_ENV=#如果在dble本机导入split后的mysqldump文件,则须要设置变量LOADIN="locally",#如果须要将split后的mysqldump文件cp到后端mysql所在主机去执行导入,则须要设置变量LOADIN="remote"LOADIN="locally"test_dir='/tmp/splittest/'dble_conf_dir='/opt/dble/conf/'ex_dump_file_name='benchmarksql_with_data'dump_file_name='benchmarksql_with_data'shardingNum=10ex_shardingNum=10MYSQL='/usr/bin/mysql -uxxxx -pxxxx -P3306'MYSQL_HOST[0]='xx.xx.xx.101'MYSQL_HOST[1]='xx.xx.xx.102'MYSQL_HOST[2]='xx.xx.xx.105'MYSQL_HOST[3]='xx.xx.xx.108'DBLE_ROOT='/usr/bin/mysql -uroot -p111111 -P9066 -h127.0.0.1'function create_backend_mysqls_from_dble_cmd () { #make file drop_and_create_shardingnodes_10dn for further test drop_ex_shardingnodes="${test_dir}drop_ex_shardingnodes_dnx.sql" create_shardingnodes="${test_dir}create_shardingnodes_dnx.sql" rm -f ${drop_ex_shardingnodes} cat>"${drop_ex_shardingnodes}"<<EOFDROPdrop database @@shardingnode="an\$1-${ex_shardingNum}";EOFDROP rm -f ${create_shardingnodes} cat>"${create_shardingnodes}"<<EOFCREATEreload @@config_all;create database @@shardingnode="an\$1-${shardingNum}";EOFCREATE ${DBLE_ROOT} < ${drop_ex_shardingnodes} if [[ $? != 0 ]]; then echo "fail to drop backend schema via dble admin cmd line" exit 1 fi #change sharding.xml conf of new_sharding.xml mv ${dble_conf_dir}sharding.xml ${dble_conf_dir}sharding_${ex_shardingNum}.xml mv ${dble_conf_dir}sharding_${shardingNum}.xml ${dble_conf_dir}sharding.xml ${DBLE_ROOT} < ${create_shardingnodes} if [[ $? != 0 ]]; then echo "fail to create backend schema via dble admin cmd line" exit 1 fi # check backend mysqldbs has been created ${MYSQL} -h${MYSQL_HOST[1]} -e "show databases;" | grep "dh_dn_" if [[ $? != 0 ]]; then echo "fail to create backend schema via dble admin cmd line" fi }function generate_rm_old_split_dump_files () { filename="${test_dir}rm_old_split_dump_files.sh" rm -f ${filename}cat>"${filename}"<<EOF#!/usr/bin/expect -fset timeout -1set host [lindex \$argv 0]set file_name [lindex \$argv 1]spawn ssh test@\$host "rm -f \$file_name.sql-an*;ls -l /tmp/splittest/"expect "*continue connecting*"send "yes\r"expect "*password:"send "mypasswordfortestuser\r"expect eofEOF}function rm_old_dump_files_on_each_shardingnodes () { rm -f ${test_dir}${ex_dump_file_name}.sql-an* # 新环境中首次跑测试的时候须要生成这样一个文件 ${test_dir}rm_old_split_dump_files.sh if [[ "${TEST_ENV}" == "new" ]]; then generate_rm_old_split_dump_files fi for host in "${MYSQL_HOST[@]}";do echo "${host}" expect ${test_dir}rm_old_split_dump_files.sh "${host}" "${test_dir}${ex_dump_file_name}" done}# split_cmd.sql 文件中有 dump_file_name,此处还能够参数化 -l等参数的数值function get_split_exec_cost_time () { filename="${test_dir}split_cmd.sql" rm -f ${filename} cat>"${filename}"<<EOFsplit /opt/splitTest/${dump_file_name}.sql /tmp/splittest -sbenchmarksql;EOF { echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> start exec split cmd on dble manager 9066" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime" # echo "${DBLE_ROOT} < ${filename}" echo "split /opt/splitTest/${dump_file_name}.sql /tmp/splittest -sbenchmarksql; " }>> time_record.log timer_start=$(date +%s) ${DBLE_ROOT} < ${filename} if [[ $? != 0 ]]; then echo "$(date +["%Y-%m-%d %H:%M:%S"]) !!!!!!!!!!! fail to exec !!!!!!!!!!" >> time_record.log fi timer_end=$(date +%s) duration=$(echo "$timer_end" "$timer_start" | awk '{print $1-$2}')s { echo "dble治理端执行split的耗时: ${duration} " echo "total time is ${duration} " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> finish exec split cmd on dble manager 9066" echo " " }>> time_record.log }# dble本机近程连贯后端mysql,别离并发导入function loadAll_shardingDumpFiles_on_dble_server () { { echo " " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> loadAll_shardingDumpFiles_on_dble_server startTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime" }>> time_record.log timer_s=$(date +%s) for ((i=1;i<="${shardingNum}";i++)) do { if [ ! -f "${test_dir}${dump_file_name}.sql-an${i}.sql" ]; then mv ${test_dir}${dump_file_name}.sql-an"${i}"-*dump ${test_dir}${dump_file_name}.sql-an"${i}".sql fi node=$(( i % 4 )) case ${node} in 1) host=${MYSQL_HOST[0]};; 2) host=${MYSQL_HOST[1]};; 3) host=${MYSQL_HOST[2]};; 0) host=${MYSQL_HOST[3]};; esac echo "${MYSQL} -h${host} dh_dn_${i} < ${test_dir}${dump_file_name}.sql-an${i}.sql" >> time_record.log ${MYSQL} -h${host} dh_dn_"${i}" < ${test_dir}${dump_file_name}.sql-an"${i}".sql }& done wait timer_e=$(date +%s) tduration=$(echo "$timer_e" "$timer_s" | awk '{print $1-$2}')s { echo "split后的dumpfile文件从dble本机并发导入,总时长(即最长耗时)为: ${tduration} " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> loadAll_shardingDumpFiles_on_dble_server finishTime" echo " " }>> time_record.log}# local导入耗时不须要此处function generate_send_split_dump_files () { filename="${test_dir}send_split_dump_files.sh" rm -f ${filename}cat>"${filename}"<<EOF#!/usr/bin/expect -fset timeout -1set file_num [lindex \$argv 0]set host [lindex \$argv 1]set file_name [lindex \$argv 2]spawn scp \$file_name.sql-an\$file_num.sql test@\$host:/tmp/splittest/.expect "*continue connecting*"send "yes\r"expect "*password:"send "mypasswordfortestuser\r"expect eofEOF}# local导入耗时不须要此处function change_split_dumpfile_name_and_cp_them_to_their_local () { # 新环境中首次跑测试的时候须要生成这样一个文件 ${test_dir}t_dump_files.sh if [[ ("${TEST_ENV}" == "new") && ("${LOADIN}" == "remote") ]]; then generate_send_split_dump_files fi { echo " " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> start change split filename and cp them to their local mysql server hosts" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime" }>> time_record.log timer_st=$(date +%s) for ((i=1;i<="${shardingNum}";i++)) do { if [ ! -f "${test_dir}${dump_file_name}.sql-an${i}.sql" ]; then mv ${test_dir}${dump_file_name}.sql-an"${i}"-*dump ${test_dir}${dump_file_name}.sql-an"${i}".sql fi node=$(( i % 4 )) case ${node} in 1) host=${MYSQL_HOST[0]};; 2) host=${MYSQL_HOST[1]};; 3) host=${MYSQL_HOST[2]};; 0) host=${MYSQL_HOST[3]};; esac # scp ${test_dir}${dump_file_name}.sql-an"${i}".sql test@${host}:/tmp/splittest/. expect "${test_dir}"send_split_dump_files.sh "${i}" "${host}" "${test_dir}${dump_file_name}" } done timer_ed=$(date +%s) cpduration=$(echo "$timer_ed" "$timer_st" | awk '{print $1-$2}')s { echo "split后的dumpfile文件cp到对应后端mysql本机,总时长(即最长耗时)为: ${cpduration} " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> finish change split filename and cp them to their local mysql server hosts" echo " " }>> time_record.log}function exec_romote_test_time_on_each_hosts () { { echo " " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> exec_remote_loadin_on_each_host startTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime" }>> time_record.log timer_s=$(date +%s) for host in "${MYSQL_HOST[@]}" do { echo "${host}" expect "${test_dir}"exec_shell_on_remote_server.sh "${host}" }& done wait timer_e=$(date +%s) tduration=$(echo "$timer_e" "$timer_s" | awk '{print $1-$2}')s { echo "split后的dumpfile文件从后端mysql本机并发导入,总时长(即最长耗时)为: ${tduration} " echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime" echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> exec_remote_loadin_on_each_host finishTime" echo " " }>> time_record.log}function clean_backend_schemas_and_old_dump_files () { rm_old_dump_files_on_each_shardingnodes create_backend_mysqls_from_dble_cmd}function test_of_split_dumpfile_on_mysql_respectively () { echo "NOW we are testing scp split_dumpfiles to mysql and loadin respectively,and shardingnode num is ${shardingNum}--------------------------------------------------------------">> time_record.log clean_backend_schemas_and_old_dump_files get_split_exec_cost_time change_split_dumpfile_name_and_cp_them_to_their_local exec_romote_test_time_on_each_hosts echo "NOW we have finished the testing of scp split_dumpfiles to mysql and loadin respectively,and shardingnode num is ${shardingNum}---------------------------------------------">> time_record.log}function test_of_split_dumpfile_on_dbleServer () { echo "NOW we are testing loadin on dble server locally,and shardingnode num is ${shardingNum}--------------------------------------------------------------">> time_record.log clean_backend_schemas_and_old_dump_files get_split_exec_cost_time loadAll_shardingDumpFiles_on_dble_server echo "NOW we have finished the testing of loadin on dble server locally,and shardingnode num is ${shardingNum}---------------------------------------------">> time_record.log}if [ ${LOADIN} == "locally" ]; then test_of_split_dumpfile_on_dbleServerelif [ ${LOADIN} == "remote" ]; then test_of_split_dumpfile_on_mysql_respectivelyelse echo "please check the file line 7: The value of variable LOADIN should be one of 'locally' or 'remote' ;The variable maybe on line 7" exit 1 fi

July 13, 2022 · 4 min · jiezi

关于脚本:脚本之美│VBS-入门交互实战

一、什么是 VBSVBS 是一种 Windows 脚本语言,全称是 Microsoft Visual Basic Script Editon,微软公司可视化 BASIC 脚本版vbs 是零碎内置的,代码可在 windows 零碎中间接执行,不须要编译环境,十分的不便vbs 脚本简略,高效,大部分性能都能够实现,利用好 vbs 脚本,能够极大的提高效率,能够用它来做一些重复繁琐的机器操作二、第一个 VBS 脚本在桌面上新建一个文本文档关上文本文档,在其中输出 msgbox "Hello World!"将文本文档的格局后缀 .txt 改为 .vbs而后双击运行文件即可 三、msgbox 语法语法:msgbox "对话框内容","对话框类型(参数:0,1,2,3,4,5)","对话框题目"对话框内容:是指弹窗的主体内容对话框类型:能够抉择 0-5 共6种类型的对话框模式,0时对话框只有确定按钮;1时对话框有确定按钮、勾销按钮;2时对话框有停止按钮、重试按钮、疏忽按钮;3时对话框有是按钮、否按钮、勾销按钮;4时对话框有是按钮、否按钮并且对话框禁止点击右上角的敞开按钮;5时对话框有重试按钮、勾销按钮。如果不填默认为0对话框题目:是指弹窗的题目msgbox "飞兔小哥送你一份奖品待支付", 3, "舒适揭示" 四、中文乱码上图能够看到中文乱码了这次要是因为编码谬误导致的,失常的文本文档它的编码格局是 UTF-8 的,然而 VBS 脚本须要编码格局是 ANSI 才能够失常运行中文这时候咱们须要 关上文本文档 ► 点击左上角文件 ► 另存为 ► 抉择编码为ANSI ► 确定 即可解决 五、弹窗交互性能下面咱们只是实现了很简略的展现性能,那么咱们须要实现交互性能,就要用到变量了在 vbs 中能够通过 dim 定义变量,语法为:dim 变量名1,变量名2,变量名3...变量名n其中 inputbox 能够用来接管用户手动输出的参数dim namename = inputbox("请通知我您是谁", "这是交互的题目")msgbox name,,"欢迎您" 六、表白恶搞之前很火的敞开不了的表白弹窗,就是 vbs 做进去的应用 dim a(5) 能够定义数组,5示意这个数组外面有多少元素应用 Select Case 示意这是一个选项其中抉择批准的返回值为6,不批准的返回值为7如果点击了不批准,那就循环从数组中取值展现如果用户点击了批准,那就诡计未遂,退出选项MsgBox "佛前哭求"MsgBox "奈何桥期待"MsgBox "五百次回眸"MsgBox "千年的回首"MsgBox "百世的轮回"MsgBox "换你今朝一世情缘"MsgBox "可否"dim a(5)a(0)="天大,地大,女友最大"a(1)="工资上交"a(2)="房写你名"a(3)="帮清购物车"a(4)="保大"a(5)="你就许可我把^o^"Dim jDoSelect Case msgbox ("姑娘,做我女朋友吧", 4)Case 6 MsgBox "you are my girlfriend," + Chr(13) + "from this day until to my last days."exit doCase 7msgbox a(i)i=i+1if i >= 6 theni = 0end ifend SelectLoop ...

June 23, 2022 · 1 min · jiezi

关于脚本:脚本执行常见错误buildsh-caller-not-found

1 bash与dash从Ubuntu 6.10开始,默认应用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell)但Login Shell还是bash. 起因是dash更快、更高效,而且它合乎POSIX标准。Ubuntu在启动的时候会运行很多shell脚本,应用dash能够放慢启动速度。 2 执行脚本经常会有一些不出名的谬误比方:build.sh: caller: not found 我还遇到过还有一些其余莫名其妙的谬误 先看下本人的脚本是用bash解析还是dash解析的,脚本咱们个别默认都是用bash 先用命令ls -l /bin/sh看看本人零碎的脚本解析 3 切换sh为bash/dashsudo dpkg-reconfigure dash呈现一个界面抉择否切换为bash解析即可解决:build.sh: caller: not found 切换回去从新执行一遍命令抉择是即可

February 28, 2022 · 1 min · jiezi

关于脚本:使用脚本一键打包并上传docker镜像

笔者搞了一年多微前端我的项目,一个团队治理十个微利用,换成docker镜像部署后,公布操作一下从原来的脚本直连服务器的1分钟变成了几十分钟,尤其上传每个利用到各自的阿里云仓库。这里就再写个脚本一键打包docker镜像并上传阿里云。 本文只讲怎么制作一个脚本帮忙去加重开发人员累赘,对于docker-compose的配置见:应用各种姿态难受的部署微前端我的项目(上:打包与上传) 效果图 间接上代码/** * @name docker镜像打包上传脚本 * @author weilan * @time 2021.02.22 */const fs = require('fs');const path = require('path');const util = require('util');const { log } = require('../utils/log');const exec = util.promisify(require('child_process').exec);const sub_app_ath = path.resolve();let sub_apps = fs.readdirSync(sub_app_ath).filter(i => /^subapp|master/.test(i));const inquirer = require('inquirer'); // 用于命令行交互/** * @name 命令行交互配置项 */const question = [ { type: 'confirm', name: 'dist', message: '是否须要打包前端动态资源?', }, { type: 'confirm', name: 'env', message: '请抉择是否须要打包成不联网的内网部署', when: function (answers) { // 当answer为true的时候才会发问以后问题 return answers.dist } }, { type: 'checkbox', name: 'apps', message: '请抉择要公布的模块', choices: sub_apps, validate: function (val) { if (val.length) { // 校验 return true; } return "抉择不能为空"; } },]/** * @name 依据命令交互配置后果做逻辑解决 */inquirer.prompt(question).then(async (answer) => { let subApps = answer.apps; let buildScript = answer.env ? 'yarn build --Intranet' : 'yarn build'; let needDist = answer.dist; let now = +new Date(); // 登录阿里云 const { error: loginError } = await exec('docker login --username=哈哈哈 --password=嘿嘿 registry.cn-zhangjiakou.aliyuncs.com'); if (loginError) { log.red(loginError, '登录镜像核心失败') return; } console.log(`开始顺次解决 ${JSON.stringify(subApps)} ......`); subApps.reduce((chain, item) => { return chain.then(() => publishIamge(item, now, needDist, buildScript)) }, Promise.resolve())});/** * @name 打包镜像并推送阿里云 * @param {String} moduleName 模块名 * @param {String} now 以后版本工夫戳 * @param {Boolean} needDist 是否须要打包前端动态资源 * @param {String} buildScript 前端动态资源打包命令 */async function publishIamge(moduleName, now, needDist, buildScript) { // 打包前端动态资源 if (needDist) { console.log('开始打包前端动态资源' + moduleName); const { error } = await exec(buildScript, { cwd: path.resolve(moduleName) }); if (error) { log.red(moduleName, '前端代码打包谬误:', error) return; } log.green(moduleName + '前端代码打包胜利') } // 打包镜像 console.log(`开始打包镜像 ${moduleName} ......`); const { stdout: buildStdout, error: buildError } = await exec('docker-compose build ' + moduleName); if (buildError) { log.red(buildError, '镜像打包谬误') return; } log.cyan(buildStdout) log.green('镜像打包实现,开始制作镜像标签') // 更新镜像标签 const imageName = 'ibp2fe_' + moduleName; const { error: tagError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}:${now}`); if (tagError) { log.red(tagError, '镜像标签异样') return; } log.green('镜像版本标签更新结束,开始更新last标签') // 更新镜像标签last版本 const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`); if (tagLastError) { log.red(tagError, '镜像last标签异样') return; } log.green('镜像last标签更新结束,开始上传') const { stdout: pushStdout, error: pushError } = await exec('docker push registry.cn-zhangjiakou.aliyuncs.com/futureweb/' + imageName); if (pushError) { log.red(pushError, '镜像上传失败') return; } log.cyan(pushStdout) log.green('镜像上传胜利')}process.on('unhandledRejection', (reason, p) => { console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); // application specific logging, throwing an error, or other logic here});实现思路和注意事项首先思考命令行交互的形式,将须要做的配置以抉择的形式让开发人员确认,最初抉择要公布的模块提前登录阿里云账号这里能够抉择并发执行所选全副模块,然而这样日志输入会无序,且电脑压力极大会临时死机;因而这里我用顺次解决的形式打包所选模块的前端动态资源执行docker-compose build xxx 打包所选模块镜像这里有个须要留神的点,因为是工具函数解决,每个模块的门路由node读取,因而你的模块名和docker-compose.yml里的服务名、容器名最好都统一;另外留神你的镜像打包后是你docker-compose.yml外的根目录下划线连贯你的docker-compose服务名,因而你的阿里云镜像仓库命名最好和这个组合后镜像名统一;以上都是为了不便工具函数可能通用解决各个模块镜像。制作镜像标签。这里我会制作一个本次公布工夫戳的版本和一个lastet版本,后面不便回退,前面不便运维部署时无需关怀标签版本。也能够拉取git tag来做镜像的tag。制作镜像后上传至阿里云镜像核心

February 24, 2021 · 2 min · jiezi