linux和windows下的反斜杠\和正斜杠/区别
Windows:——“/”是表示参数,“\”是表示本地路径。
xcopy /E /Y D:\DailyBuild\LatestBuild\Client\Binaries C:\Users\ffff\Desktop\新建文件夹\Binaries\
Linux和Unix——“-”和“--”表示参数,“/”表示路径。“\”表示转义(或其他含义 比如下面的\cp 以及命令换行),
\cp -f ${WORKSPACE}/Release/android/**/*.zip /Users/banben/workspace/${upftpjob}/
网络:——由于网络使用Unix标准,所以网络路径用“/”。
linux和windows下的换行符
在Linux下修改并保存,则换行是 \n ,在Windows下修改并保存,则换行是 \r \n
notepad++打开文本,最下面点击Windows右键可以看到有这三种选择:
Shell常用命令
目录
linux 一说到命令行,我们真正指的是 shell。
shell就是保护这linux操作系统的外壳,我们通过操作shell,去调用内核。而操作系统的内核则管理的计算机的硬件。从而完成我们一些需要硬件的任务。。播放音乐 显示文字。
(
在DOS系统中,command.com就是DOS的shell。
DOS启动以后先完成一些重要的初始化工作,然后运行command.com,运行后,执行相关的任务,然后显示盘符和当前路径的提示符,等待用户的输入。
用户可以输入命令,或者要执行的程序
当运行程序时,command找到这个程序,将其载入内存,设置CS:IP为程序的入口,而后command停止运行,程序运行。即CPU开始执行程序的指令。程序运行结束后,返回到command,再次运行command,等待用户的输入。
)
侠义的shell 是命令行方面的软件。比如linux默认的bash,windows下的cmd? gitbash?。
广义的shell 是包括图形界面的软件。因为图形界面的应用程序也能操作调用内核进行工作,都是代码呗。
一般说shell都是侠义的意思。其实就是一个程序,它接受从键盘输入的命令, 然后把命令传递给操作系统去执行。而这些命令其实就是一个个的应用程序的名字————man,chmod,chown,vi,fdisk
shell的设计除了可以通过调用其他独立的应用程序外,一般还会有自己内置的命令。
linux下shell环境(shell的应用程序)有很多,而bash(Bourne Again Shell,sh是Bourne Shell)是大多数的Linux系统默认的shell环境。开机以后,进入的就是开一个的一个bash了。输入,echo $SHELL 查看当前系统默认的shell——是bash
0.对你的linux的基本的认识
linux的版本
目前内核的驱动程序所在的模块目录
cd /lib/modules/`uname -r`/kernel
可以看看cd /lib/modules/这个目录下有几个内核版本
bash中命令运行的查找顺序
1.以相对或者绝对路径来执行命令
2.由alias找到该命令来执行
3.由bash内置的命令来执行
4.通过$PATH这个环境变量中设置的顺序找到的第一个命令来执行。
1./etc/shells 和 /etc/passwd 和 cat /etc/issue 和 /etc/motd 和 /etc/profile
cat /etc/shells 查看当前系统支持可用的shell语种——(直接输入shell名字进行切换其他shell,exit直接退出)
这个文件是记录的是系统上合法的shell。系统的某些服务,在运行中,会检查用户可以用的shells,这个时候就是用检查这个文件,来查看是否可以某种shell。
cat /etc/passwd 可以看到用户和可以用的shell环境——root用户,普通用户,伪用户(nologin)——忽略 我也不知道再说什么 等看到账户管理的时候再说
root账户登录的时候 是bin/bash。
其他账户有一些奇怪的 nologin等
当我们顺利的在终端机上登录以后,linux就会根据/etc/passwd文件的设置给我们一个默认的shell环境进行执行。
cat /etc/issue 可以看到在终端登录以后显示的信息。cat /etc/issue.net 远程用户登录。里面可以配置 /r /m 等具有特殊含义的符号。
/etc/motd 配置的是 在用户(一般账号和root)登录主机以后都可以显示的信息,不知到跟issue有什么区别。
etc/profile 是每个用户(普通用户或者root)取得一个bash(login shell)的时候一定会读取的配置文件。其实是一个shell脚本。粗粗看一下,可以看到根据$UID 这个变量的值来做不同的设置,比如设置PATH,MAIL,USER的值等等。以及会调用其他的一些bash脚本。
sh登录其实有login shell 和 non-login shell。login shell就是需要输入用户名密码才能取得的shell。non-login shell就是不用的。
login shell方式登录的时候读取的配置文件的执行的流程。
先执行/etc/profile,再执行~/.bash_profile (如果没有,就找~/.bash_login;如果再没有,就找~/.profile)
上图没有画出来,/etc/profile中会设置PATH,MAIL,USER等变量的值
其中,/etc/profile.d/下面的可执行的sh文件都会被执行,你有想写的可以写里面。比如/etc/profile.d/lang.sh就会去执行/etc/sysconfig/i18n 设置LANG 这个变量
其中,/etc/bashrc 会设置PS1变量的值,以及同样会执行/etc/profile.d/下的脚本
etc/man.config
bash脚本其他知识点:
shebang行——she表示字符#(sharp,hash,mesh),bang表示叹号!,所以shebang行就是#!行。Linux环境下的脚本都是以这样的一个shebang行作为起始行,shell通过#! 后面的解释器来运行脚本。所以bash脚本的shebang行就是#!/bin/bash
sh脚本的运行方式——将脚本作为sh的命令行参数运行 或者 将脚本作为具有可执行权限(chmod a+x)的可执行参数,直接运行。后者就会用到shebang行。
终端和shell——(虚拟)终端terminal是交互式工具,shell是运行在terminal上的程序,一般在terminal中会启一个shell,所以你看到人们在terminal中写一些命令,这些命令实际上是被terminal启动的交互式shell所解释的。——如何开启多个终端
在bash中,每个命令或者是命令序列,都是通过使用分号或者换行符来分隔的。#是注释。
2.bash一些比较实用的功能
1.命令记忆——history命令和~/.bash_history文件
history ----》列出内存中所有的记录的命令
history -w----》将内存中记录的命令写入到 ~/.bash_history 当中,~/.bash_history总是存着最近的HISTSIZE条记录。如果不是强制写入,就会在用户注销的时候写入。而每次登录bash的时候,系统也会先去读取这个文件,这样就知道上次的历史命令了。
结合history的内容来执行命令
!66 ---》执行第66笔命令
!!----》执行上一条命令
!al----》执行最近以al为开头的命令
存在问题:
同一账号同时多次登录history最后注销的写入问题,比如开着好几个bash窗口,登入用户都是同一个,那么最后记录到~/.bash_history文件中的会是最后一个。
ps:
~/.bash_logout 是一个脚本,意图是当注销bash后系统再帮我做什么操作后再离开 。
2.命令与文件补齐——TAB键
3.命令别名——alias和unalias命令
比如ll其实就是一个命令别名:
怎么设置:
alias lm='ls -l | more'
alias rm='rm -i'
alias cls='clear'
查看目前已经哪些命令别名了呢:
取消:
unalias lm
4.过程控制——jobs——17章命令控制
5.脚本——shell脚本
6.通配符
3.一些内置命令
type
输入以下试试:可以知道是不是内置命令,可执行文件所在的路径等等
type -a type
type -a ll
type -a cd
我一般用a,其他参数含义如下(man type 往下翻找到的。man是在线查询来查询命令的使用方式和参数说明)。type可以用来作为类似which命令的用途。
echo
变量的显示,纯文本的显示 。就是显示一字串在终端机上。
如果该变量不存在就显示错误应该怎么设置,跟变量是不是设置成空区分开来
echo -n 显示完以后不会有跳行的动作。
source
等同于. 在当前shell生效。将配置文件的内容读取到目前的shell环境中。
4.转移符号\
特殊字符
/应该不特殊字符,没啥特殊含义。
\ $ 是特殊字符
\[Enter]——转义 开始执行 为 下一行继续输入
5.环境变量
变量的概述
环境变量也是变量的一种。
1)定义变量
变量是需要类似于“echo”的命令才能够调用变量的内容。
:变量名=变量值。等号两边不能有空格。
:用read命令,由键盘输入赋值变量是多少。
2)双引号内的特殊字符,保持其特殊字符的特殊含义(除了前面加了\转义字符进行转义,那就跟单引号没啥区别了)。单引号内的特殊字符,就是其字面显示纯文本。比如$这个,在双引号内就是表示后面是变量名,取其值。单引号内就是$这个字符。
3)`完整的命令`反引号 等于 $(完整的命令) , 把命令的返回信息赋值给一个变量(如下图),或者直接用 cd /lib/modules/`uname -r`/kernel
files = $(ls *.txt)
for filename in $files
do
echo "$filename"
donels -l `locate crontab` //查看跟crontab相关的文件权限
4)“$变量名” , ${变量名} ,把变量名显示得更加明确。
PATH="$PATH":home/bin
这个例子其实不加也行,下面这个就不行了
5)几个设置变量的可见范围以及显示变量有关的命令
- unset 变量名:取消这个变量设置
- env:查看所有的环境变量。
- export:1)单独的export:查看所有的环境变量。2)export 变量名 : 将这个变量导出成环境变量。(也可以用 declare -x 。具体这个命令的用法查看man declare吧。declare -r还能将变量设置为只读属性不能修改)
- set:查看环境变量+其他的变量(一些与bash操作接口有关的变量,比如PS1就是定义命令之前的提示符的格式的+用户自行一的变量)。环境变量和与bash操作接口有关的变量都是系统需要的变量都是大写一般。
username@hostname $——普通用户,提示符是$。或者:
root@hostname #——root用户下是#提示的, root用户最高权限的用户,上面的例子中就是root用户
不同的shell环境PS1不一样。
6)变量的类型
:定义数值类型 (数值运算,最多只能达到整数类型)
declare -i number=1+1 ; echo $number
:定义数组类型变量:循环中,在脚本中的比较多
7)特殊的变量
$:目前这个shell的线程号PID
?:上一个执行的命令所返回的值
echo $$
echo $?
8)父进程的环境变量会被子进程继承,但是普通的自定义的变量不行。
(为什么,因为内存配置的关系,涉及到子进程的创建,以及环境变量的内存位置)
9)变量内容的删除,和替换
#和##,%和%%是删除
//和/是替换,是符合的内容的替换掉
先经过测试再进行设置值(相当于变量内容全部替换成新的内容)
一般来说str:代表没有str这个变量或者str这个变量值是为空。str仅仅代表这个变量值是为空。
用echo不知道变量是否存在,用unset 一下变量,确保不存在。
2)常用环境变量 PATH
path是环境变量吗 可以随意修改环境变量吗 如果是的话 修改了以后 子进程中还可以用
PATH——执行文件查找的路径
3)环境变量是谁给你设置的
比如查看你当前的默认的shell用的是什么环境的,就输入:
echo $SHELL
6.跟查找有关的命令
locate——列出所有相关的文件名
7.编码问题
语系问题
查看当前环境下的跟语系(编码)有关的变量
locale
LANG和LC_ALL是最重要的,如果其他的没有设置就会用这个的值。
当启动某些程序的时候,就会去分析这个LANG,使用这种编码进行解析文本。
查看系统支持那些语系(编码)
locale -a
(具体用法就看 man locale吧)
中文编码通常是 zn_CN.gb2312 和 zn_CN.UTF-8
语系相关文件
语系文件存放目录:/usr/lib/locale/
整体默认的语系定义文件:/etc/sysconfig/i18n
8.多用户登录
当前用户的所有限制数据的数值:
ulimit -a
如下图显示:-f就是用来限制可创建的文件大小,比如要限制10M,就用:ulimit -f 10240 。单位是kb,10240kb=10Mb
dd指令:
dd if=/dev/zero of=123 bs=1M count=20 ===>创建失败,大于10Mb了。
1.$0,$1,$2.....$#的含义
用于读取输入参数。
1).$0
Shell本身的文件名。test.sh:
cd `dirname $0`
含义为:用于取得脚本文件.sh 所在目录,然后将当前目录切换过去
ps:``反引号 等同于$() , 用于命令替换
命令替换是指 shell 可以先执行命令,将输出结果暂时保存,在适当的地方输出
下面例子用的 $() 进行命令替换
files = $(ls *.txt)
for filename in $files
do
echo "$filename"
done
for循环语法:
for 变量 in 取值列表
do
各种操作
done
2).$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。test.sh:
cd `dirname $0`
python test.py $1 $2 $3
3).$#
参数个数,从$1开始算,不算$0
4)上级目录$(dirname "$PWD")
比如:
$(dirname "$PWD")/tmp/文件名
tmp 这个文件夹一定要存在,如果不存在,就会说没有此目录。文件名可以不存在的。
2.比较操作符
用于比较数值大小以及字符串大小,有的比较操作符只能用 单词简写,有的比较操作符也可以用 对应的符号 来标识。注意区分数值大小 和 字符串大小的 是否相等是如何比较的。
[]中写判断条件
(())
" "
$
1)整数比较 eq:equal ne:notequal gt:greater than ge:greater or equal lt:less than le:less or equal
等于
-eq ,如:if [ "$a" -eq "$b" ]
不等于
-ne ,如:if [ "$a" -ne "$b" ]
大于
-gt ,如:if [ "$a" -gt "$b" ]
> (需要双括号),如:if(("$a" > "$b"))
大于等于
-ge ,如:if [ "$a" -ge "$b" ]
>= (需要双括号),如:if(("$a" >= "$b"))
小于
-lt ,如:if [ "$a" -lt "$b" ]
< (需要双括号),如:if(("$a" < "$b"))
小于等于
-le ,如:if [ "$a" -le "$b" ]
<= (需要双括号),如:if(("$a" <= "$b"))
2)字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
!= 不等于,如:if [ "$a" != "$b" ]
3)前面加x
if [ x"$1" == x"a" ];then
echo right
else
echo wrong
fi
为什么比较前面要加x:
在一些UNIX系统:变量比较的时候,如果变量为空,或者未定义,这样会引起错误。
3.重定向
重定向是很常用的一个功能,来定制我们想要输入或者输出的地方。
介绍下在shell脚本中的三个文件。默认情况下,这三个文件处于打开状态:
- 标准输入文件(stdin,默认标准输入文件为键盘输入)----文件描述符是0
- 标准输出文件(stdout,默认标准输出文件为屏幕)----文件描述符是1
- 标准错误文件(stderr,默认标准错误文件为屏幕)----文件描述符是2
关于重定向的符号:
- 输出文件重定向符号 1> (也可以简写为>)
比如输出重定向到 file 文件,command > file,或者 command 1> file
如果直接command,那么就是输出到屏幕中。
- 错误文件重定向符号 2>
command 2 > file:错误信息重定向到 file文件
- 输出文件和错误文件统一重定向
command > file 2>&1:错误和输出都重定向到 file文件(command > file 表示输出重定向到file, 2>&1表示错误返回值传递给1输出通道,即file)
或者
command &> file:&>file 意思是把标准输出 和 标准错误 都重定向到文件file中
ps:/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。
.
5.定义变量不要有空格
mobileprovision_uuid=
mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i ${local_path}${certificateName})`
echo ${mobileprovision_uuid} > ${WORKSPACE}/iOSProvisionCode.txt
ps:
1.PlistBuddy是Mac自带的专门解析plist的小工具,“Print ”代表 打印字段相应的值,这里指的是打印出 “UUID”字段的值
2.``反引号 等同于$() , 用于命令替换
3. <<< bash - What does <<< mean? - Unix & Linux Stack Exchange
4.连接字符串 ${var1}${var2}
5.command > .txt 输出重定向
7.在一行执行多条命令
&&
第2条命令只有在第1条命令成功执行(产生了0退出码)之后才执行
||
第2条命令只有在第1条命令执行失败(产生了一个非0的退出码)之后才执行
;
第2条命令在第1条命令执行完(不管是否成功)才执行
if [ 条件判断语句 ];then
else
fi
8.判断条件
语法:
if [ 条件判断语句 ];then
else
fi
具体例子
if [ ${HotUpdateResource} = "true" ];then
\cp -f ${WORKSPACE}/Release/android/**/*.zip /Users/banben/workspace/${upftpjob}/
\cp -f /Users/banben/workspace/${upftpjob}/*Android.zip /Users/banben/workspace/upyunwei
else
echo "HotUpdateResource is false"
fi
ps:
1. \cp 直接拷贝覆盖不提示
9.mount,cd,ls,cp,mv,rm
mount: 查看当前挂在
cd: 移动到其他挂载
ls: 当前目录下的目录 (ls -l == ll )
cp:复制文件 cp oldfile newfile
也可以复制到目录下:cp file directory
但是如果这个directory没有创建的话 就会当成是文件进行创建名字为directory的文件了
#:注释
wc -l:统计输出的行数
sort -n test.txt | uniq: 去掉重复的行
rm :删除
mv :重命名(两个都是目录)或 移动(将文件移动到目录下)
10.shopt 显示linux行为命令
查看当前的行为命令:比如 nocaseglob 为 off 就是 大小写敏感。
如何开启:
shopt -s nocaseglob
有什么用:
ls .txt
如果nocaseglob选项是关闭的,就是搜出 txt的
如果nocaseglob选项是开启的,就是搜出 txt TXT 等都能匹配
11.文件编码格式的转换 iconv
iconv -f encoding [-t encoding] [inputfile]...
//IGNORE 忽略翻译不过来的的字符
find . -name $filename | xargs -I{} iconv -f GB2312 -t UTF-8//IGNORE {} -o $filename.text
如果 没有-o,就使用 >
12.处理文件名中的空格,可以正常显示带空格文件名
一般输入指令的时候,带空格文件名都要用 ' ' 括起来。
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
echo "$f"
done
IFS=$SAVEIFS
13.在shell中调用vim
vim -b 文件名<<-!
:s/old/new
:wq
!
shell脚本中调用vim 替换指定路径下文件中的字符串_zxx的专栏-优快云博客
14.awk,grep,find,cat,tr,sed,join
Windows下Git Bash显示中文问题 Windows下Git Bash显示中文问题 - 简书
join:
将两个文件合并
sed——管道命令是
echo sksksksksksk | sed 's/sk/SK/2g
变量赋值:把1.4.0 变成 1\.4\.0
file2=$(echo 1.4.0|sed 's/\./\\\./g')
sed替换字符串 会导致文本的换行符改变。
awk——行处理程序
awk 动作 文件---》对文件的每一行进行处理
1)删除每行的最后10个字符
sub(/指定域/,"替换的字符") 下面的就是把最后10个字符(.{10}$ .任意字符 $匹配行末)替换为空
最后那个1不知道啥意思。
awk '{sub(/.{10}$/,"")}1' test.unl
2)以逗号为分隔符,提取第三个字段
cat xxx.txt|awk -F, '{print$3}'|sort|uniq -c|sort -nr
sort -n -r
(ps:如果你在windows下用sort的话,用的可能不是你要用的那个sort,所以你先which一下,看看路径是不是你要用的那个exe,不是的话,把你要用的sort改一下名字。因为path路径下可能先在别的路径下找到了sort)
uniq -c
3)把前四个字段都设置为空({}中的分号为语句的分隔)
awk '{$1="";$2="";$3="";$4="";print $0}' todo1.txt > result1.txt
grep
在文件中 搜索文件内容
grep -l -i “string” *.txt
-l 列出文件内容符合指定的范本样式的文件名称。
-i 忽略字符大小写的区别
-r 递归遍历文件夹下面的文件
-A -B -C n———前 后 前后 n行
$grep -10 ‘123’ test.log//打印匹配行的前后10行
find
在目录下查找文件名的命令,比如查看空格
files=$(find . -name "* *")
cat
连接文件并打印到标准输出设备
经常用来显示文件内容
tr
可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr -d ' ' 去除空格
15.set,env和export这三个命令的区别
env显示用户的环境变量;
set 显示当前shell的定义的私有变量,包括用户的环境变量,按变量名称排序;
export 显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),按变量名称排序;
declare 同set 一样,显示当前shell的定义的变量,包括用户的环境变量
16.linux shell 字符串作变量名 间接变量引用——${!变量名}
linux shell 字符串作变量名 间接变量引用_whatday的专栏-优快云博客_shell 变量名拼接
name=yushuang
var=name
# 要获取到yushuang
echo "${!var}"
输出 yushuang
PS:一些小脚本
1.批量去除文件名中的空格
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
files=`find . -name "* *"`
for name in $files
do
echo "$name"
newname=$(echo $name | tr -d " ")
mv "$name" $newname
done
IFS=$SAVEIFS
2.输入有空格的文件名到文本中
当前目录
ls|grep " " > 1.txt 一行一行输入的是是文件名。
在ls的输出中 抓取有空格的文本 然后输入到1.txt 中
====================================
当前目录 以及子目录
find命令
find . -name "* *" -print > 2.txt 输入的文件名的区别 ./ 带有这种路径的。
3.读取文本中每一行(行中带有空格也行)
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
lines=$(cat 文件名)
for line in $lines
do
echo $line$
done
IFS=$SAVEIFS
4.复制文件的内容生成一个修改的文件,然后替换其中的一个字符,以及用新的文件名命名
#!/bin/bash
for((i=1;i<=12;i++));
do
#创建文件
# expr 后面的是计算式
ireal=$(expr $i \* 8 + 1);
stri=$(expr $i + 1);
strireal="$ireal";
echo $stri;
s1="startvoice";
s3=".bat";
filename=$s1$stri$s3;
cp ./startvoice1.bat $filename;
#找到匹配字符串并修改,要用到windows下,所以修改行尾符号
sed -i "s/roomIdx=1/roomIdx=$strireal/g" $filename
unix2dos $filename;
done
shell脚本中调用vim 替换指定路径下文件中的字符串_zxx的专栏-优快云博客
bat常用命令
目录
4.setlocal enabledelayexpansion
打开cmd,输入 help 命令名 就会出现简要的介绍
help echo
help rem
help set
help xcopy
等等用到什么查一下即可
help /?
各种符号的一些规则 命令行语法项 | Microsoft Docs
表示法 | 说明 |
---|---|
不含方括号或大括号的文本 | 必须按如下所示键入项。 |
<Text inside angle brackets> | 必须为其提供值的占位符。 |
[Text inside square brackets] | 可选项。 |
{Text inside braces} | 所需项的集合。 您必须选择一个。 |
竖线 (|) | 互斥项的分隔符。 您必须选择一个。 |
省略 (…) | 可以重复并多次使用的项。 |
也可以使用查找手册:比如说echo echo | Microsoft Docs
如果中文翻译看不懂 就看英文翻译
1.echo
1.显示消息 echo [message]
2.关闭或者开启命令回显 echo [on | off]
@echo off执行以后,后面所有的命令均不显示,包括本条命令。
echo off执行以后,后面所有的命令均不显示,但本条命令是显示。
@的作用就是关闭紧跟其后的一条命令的回显,只执行不显示
特殊用法 echo f|xcopy
echo f|xcopy %srcdir%buff.iex %desdir%buffer\buffer_0000.iex /y
加上echo f| 可以处理这种第一次拷贝时系统提示 目标是文件名还是目录名
2.注释符号REM
注释
3.设置环境变量set
set 环境变量=[string]
set _devenv="%VS100COMNTOOLS%..\IDE\devenv.com"
set _log="ShadowBaneClientCompile.log"
VS100COMNTOOLS是设置过的一个系统环境变量,可以界面查看,也可以命令行查看
SET /A expression
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符SET /P variable=[promptString]
/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。
if exist "svnversion.txt" (
set /p Old_Revision=<svnversion.txt
echo Old_Revision = !Old_Revision!
) else (
set /a Old_Revision=%SVN_REVISION%-10
echo 如无旧Revision高度则获取最近10条提交信息
echo !Old_Revision!
)
)
等待用户的输入
@echo off
set /p input=请输入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
pause
exit:A
echo 您输入的字母是A
pause
exit:B
echo 您输入的字母是B
pause
exit
4.%1 传入的第一个参数
if "%1"=="1" (
echo ---------rebuild----------- >%_log%set _buildcmd=/rebuild
) else (
echo ---------build--------- >%_log%set _buildcmd=/build
)
在configure.bat中经常看到下面这个,就是判断输入是不是不为空的:(代码中%1a==a是为了避免参数中包含双引号而导致批处理异常结束)
if NOT "%1xyz123" == "xyz123" goto init
5.>重写 >>追加
echo [%DATE% %Time%] Start compile sequence >>%_log%
echo %SVN_REVISION% > svnversion.txt
date和time变量
6.执行可执行文件
set _solution_file="Sample.sln解决方案相对路径或者绝对路径"
%_devenv% %_solution_file% %_buildcmd% "Client Final|Win32" /Project "demo工程名" /Out %_log%"Client Final|Win32" 是配置
7.%errorlevel%
判断上个命令的返回值
0是成功,非0表示错误,不同的命令有不同的错误类型值。
if not %errorlevel% == 0 echo %_solution_file% failed! Error: %errorlevel% >>%_log%
if %errorlevel% == 0 echo %_solution_file% compiled successful >>%_log%
8.exit 退出当前批处理脚本或者cmd.exe
exit [exitCode]
if not %errorlevel% == 0 exit -1
echo [%DATE% %Time%] Finished compile sequence >>%_log%
批处理 vs自动编译脚本
set _devenv="%VS100COMNTOOLS%..\IDE\devenv.com"
rem set compile log
set _log="xxx.log"
if "%1"=="1" (
set _buildcmd=/rebuild
echo ---------rebuild----------- >%_log%
) else (
echo ---------build--------- >%_log%
set _buildcmd=/build
)
echo [%DATE% %Time%] Start compile sequence >>%_log%
rem Start compile************************************************
set _solution_file="xxx.sln"
%_devenv% %_solution_file% %_buildcmd% "Client Final|Win32" /Project "xxx" /Out %_log%
if not %errorlevel% == 0 echo %_solution_file% failed! Error: %errorlevel% >>%_log%
if %errorlevel% == 0 echo %_solution_file% compiled successful >>%_log%
rem If compile failed stop processing:
if not %errorlevel% == 0 exit -1
echo [%DATE% %Time%] Finished compile sequence >>%_log%
pause
%1 和 “%1”
9.xcopy——拷贝
拷贝 源 目标
如果源是文件夹名,就拷贝文件夹下的文件到目标
一般都要加个 /E
xcopy /E /Y D:\DailyBuild\LatestBuild\Client\Binaries C:\Users\ffff\Desktop\新建文件夹\Binaries\
/E 复制目录和子目录,包括空目录。
与 /S /E 相同。可以用来修改 /T。/Y 取消提示以确认要覆盖
现有目标文件。/Q 复制时不显示文件名。
这个应该是一个意思
xcopy /E /Y /Q %ProtectZipOutDir%\* %PublishDir%\
xcopy /E /Y /Q %ReleaseDir%\* %FullPackDir%\
如果源是带有正则的文件名,就拷贝所有符合的文件到目标
xcopy /Y /Q %ReleaseDir%\*.exe %PublishDir%\
xcopy /Y /Q %ReleaseDir%\*.dll %PublishDir%\
如果源和目标都是文件名
echo F|xcopy /Y /Q %ProtectZipOutDir%\xxx_c.exe %PDBDir%\xxx_shell.exe
10.setlocal enabledelayedexpansion
【help setlocal】
详细介绍 https://www.jb51.net/article/29323.htm
变量延迟的启动语句是“setlocal enabledelayedexpansion
”,并且变量要用一对叹号“!!
”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
if exist "svnversion.txt" (
set /p Old_Revision=<svnversion.txt
echo Old_Revision = !Old_Revision!
) else (
set /a Old_Revision=%SVN_REVISION%-10
echo 如无旧Revision高度则获取最近10条提交信息
echo !Old_Revision!
)
)
11.DEL删除
DEL %ReleaseDir%\*.ilk
12.move移动文件并重命名文件和目录
MOVE %ReleaseDir%\*.pdb %PDBDir%\
13.rename或ren重命名文件
ren "name1" "name2"
14.shift
下面的含义是把输入参数一个一个打印出来,shift就移动位置,把参数的位置往前移动。可以实验一下
@echo off
:loop
if %1a==a goto :end
echo [%1]
shift
goto :loop:end
pause
15.cmd
cmd /? 可以查看后面可以跟什么参数
cmd /k dir 是执行完dir命令后不关闭命令窗口。
Visual Studio Command Prompt (2010) 命令窗口 右键 属性 查看其目标内容就是
%comspec% /k ""c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86
而comspec环境变量就是
16.goto
goto label
goto :EOF 一个特别的便签,是预定义的一个标签。将控制权传送到当前批处理脚本文件的末端,相当于就是执行完了这个批处理脚本。
这个:EOFb标签需要命令扩展被启用的情况下才能使用,默认就是启用的。
17.%~dp0
%0代表批处理脚本本身
d既是扩充到分区号
p就是扩充到路径
dp就是扩充到分区号路径
%~dp0代表的就是批处理脚本本身所在的目录
(%cd% 代表的是当前目录,就是执行命令解释器的目录,也就是执行某个批处理脚本的位置)
比如某个批处理脚本的路径是 D:\aa\b\cc\dd.bat
那么 %~dp0 就是 D:\aa\b\cc\
文件夹操作
1.rd——删除文件夹
rd /s /q "C:\Users\ffff\Desktop\新建文件夹"
if exist "C:\Users\ffff\Desktop\新建文件夹" (rd /S /Q "C:\Users\ffff\Desktop\新建文件夹")
2.md——创建文件夹
md "C:\Users\ffff\Desktop\新建文件夹"
3.xcopy——拷贝文件夹
拷贝到文件夹
xcopy /E /Y D:\DailyBuild\LatestBuild\Client\Binaries C:\Users\ffff\Desktop\新建文件夹\Binaries\
4.ren——重命名
ren "name1" "name2"
3.mklink——help mklink
创建文件或目录的符号/硬链接
Windows 中的 mklink 命令详细介绍 Windows 中的 mklink 命令 | 始终
与快捷方式的区别 Windows下mklink使用, 硬链接, 软链接和快捷方式的区别_我是guyue,guyue就是我O(∩_∩)O-优快云博客
/h/j 用dir查看为 Junction类型
执行mklink 提示没有足够的权限——通过运行 输入secpol.msc 打开本地安全策略,在符号链接权限上添加本地用户
5.重定位 >
fastboot.exe writeKeys > output.txt
6.For循环
1)基础形式
语法
在cmd窗口中:for %I in (command1) do command2
在批处理文件中:for %%I in (command1) do command2
command1外面的括号不能少。
command1表示字符串或变量。可以是一个,也可以是多个。每一个字符串或变量,称之为一个元素。每个元素之间,用空格键、跳格键、逗号、分号或等号分隔。
例子-结合通配符
当前目录下都有哪些文件
@echo off
for %%i in (*.*) do echo "%%i"
pause
列出只用两个字符作为文件名的文本文件
@echo off
for %%i in (??.txt) do echo "%%i"
pause
列出当前硬盘的分区
@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
2)进阶形式 For /F
工作用的例子:对文件进行一些svn相关的一些处理,新增文件add,删除的文件delete
For /F "tokens=1-2 delims= " %%a In ('svn st') Do (
IF %%a == ? (
svn add %%b
)
IF %%a == ^! (
svn delete %%b
)
)
语法:第三个就是上面用的
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN ('command') DO command
如果没有["options"],/f会默认以每一行来作为一个整体。
而具体的["options"] 里面写的有:
delims=分隔符——指示分隔符
tokens=数字——表示第几列
1.输出每一个行的第一个分隔出来的元素,即tokens默认=1 第一列。
for /f "delims= " %%i in (a.txt) do echo %%i
2.输出每一行第二个和第三个分隔出来的元素【 注意 j,因为i顺延 】
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
3)例子:循环执行打水印的命令(注释了)
@echo off
for /L %%I in (1,1,6205) do (
if %%I lss 10 (
echo 0000%%I
%magick composite -dissolve 10 -tile logo.png 0000%%I.png result0000%%I.png%
) else (
if %%I lss 100 (
echo 000%%I
%magick composite -dissolve 10 -tile logo.png 000%%I.png result000%%I.png%
) else (
if %%I lss 1000 (
echo 00%%I
%magick composite -dissolve 10 -tile logo.png 00%%I.png result00%%I.png%
) else (
if %%I lss 10000 (
echo 0%%I
%magick composite -dissolve 10 -tile logo.png 0%%I.png result0%%I.png%
) else (
echo %%I
)
)
)
)
)
pause
7.attrib -R
设置文件为只读类型。
8.加法运算
set realmid=1
set /a roomIdx=1
set /a add=1
set nowtitle="%realmid%-%roomIdx%-ProjectS-Release-x64.exe"
start %nowtitle% ..\bin\Project-Release-x64.exe debug Server=realm%realmid%.Config%roomIdx%
set /a roomIdx=%roomIdx%+%add%
set nowtitle="%realmid%-%roomIdx%-ProjectS-Release-x64.exe"
start %nowtitle% ..\bin\Project-Release-x64.exe debug Server=realm%realmid%.Config%roomIdx%
9.一些小工具
md5sum
计算文件的md5.
如果在windows下安装了git的话 也是有这个命令的