Shell常用命令 和 bat常用命令

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标准,所以网络路径用“/”。 

u012138730的专栏_ivy_0709_CSDN博客

linux和windows下的换行符

在Linux下修改并保存,则换行是 \n ,在Windows下修改并保存,则换行是 \r \n

notepad++打开文本,最下面点击Windows右键可以看到有这三种选择:



 Shell常用命令

目录

1.$0,$1,$2.....$#的含义

1).$0

2).$1~$n 

3).$#

4)上级目录$(dirname "$PWD")

2.比较操作符

1)整数比较

2)字符串比较 

3)前面加x

3.重定向

5.定义变量不要有空格

7.在一行执行多条命令

8.判断条件

9.mount,cd,ls,cp

10.shopt 显示linux行为命令

11.文件编码格式的转换 iconv

12.处理文件名中的空格,可以正常显示带空格文件名

13.在shell中调用vim

14.awk,grep,find,cat,tr

awk

grep

find

cat

tr

PS:一些小脚本

1.批量去除文件名中的空格

2.输入有空格的文件名到文本中

3.读取文本中每一行(行中带有空格也行)


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"
done

ls -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行为命令

http://man.linuxde.net/shopt

查看当前的行为命令:比如 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

Bash循环处理带有空格的文件名_MyBlog-CSDN博客


13.在shell中调用vim

vim -b 文件名<<-!

:s/old/new

:wq

!

shell脚本中调用vim 替换指定路径下文件中的字符串_zxx的专栏-CSDN博客


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的专栏-CSDN博客_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的专栏-CSDN博客




bat常用命令

目录

1.echo——help echo

2.REM——help rem

2.文件夹操作

1.rd——删除文件夹

2.md——创建文件夹

3.xcopy——拷贝文件夹

4.ren——重命名

4.setlocal enabledelayexpansion

5.重定位 >

6.For循环

1)基础形式

语法

例子-结合通配符

 2)进阶形式 For  /F 

7.attrib -R 

8.加法运算


打开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"

创建文件或目录的符号/硬链接

Windows 中的 mklink 命令详细介绍 Windows 中的 mklink 命令 | 始终

与快捷方式的区别 Windows下mklink使用, 硬链接, 软链接和快捷方式的区别_我是guyue,guyue就是我O(∩_∩)O-CSDN博客

/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的话 也是有这个命令的

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值