cmd 命令行小记

一、前言

由于工作中,也维护着部分Windows Server 服务器,命令行操作还是经常需要用到的,把一些非常有用但是又不不是太经常使用的命令总结。

二、 for 语句

首先,我们来看一下 for 语句的基本语法格式:

在cmd 窗口中: for %i in (SET) do command 

在批处理文件中:for %%i in (SET) do command

之所以要区分 cmd 和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同,最明显的一个差异就是: 在 cmd 窗口中, for 之后的变量 i 必须使用单百分号引用, 即 %i 。 而在批处理脚本文件中,引用变量必须使用双百分号引用,即 %%i 。 为了方便起见,若不是特别强调,以下的讲解都以批处理文件环境为例。

当在 batch 脚本中使用 FOR 命令时, 必须使用 %%variable 替代 %variable。 而且, variable 名称是大小写敏感的,所以 %i  和 %I 是不同的。

我们先来看一下 for 语句中的基本要素都有些什么

1、 for , in 和 do 是 for 语句的关键字,它们三者缺一不可。

2、 %%i 是for 语句中对形式变量的引用,就算它在 do 后的语句中没有参与语句的执行,也是必须出现的。

3、 in 之后, do 之前的括号不能省略。

4、 SET 表示字符串、变量或者文件名,可以使用通配符,  command 表示命令语句。

5、 for 命令可以接受选项,  /f  、 /r  、 /l 、/d 选项。

for 语句的注意事项以及工作原理:

1、for 语句中的形式变量 i , 可以替换为 26个字母表中的任意一个字符, 变量名区分大小写。也就是说,%%I 和%%i 会被认为不是同一个变量;形式变量 I还可以换成其他的字符,但是,为了不与批处理中的%0~%9 这10 个形式变量发生冲突,请不要随意把%%I 替换为%%0  ~%%9 中的任意一个;

2、in 和do 之间的 SET 表示的字符串、文件名或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;

3、for 语句依次提取 SET  中的每一个元素,把它的值赋予形式变量 %%i , 带到do 后的command 中参与命令的执行;并且每次只提取一个元素,然后执行一次 do 后的命令语句,而无论这个元素是否被带到 command 中参与了运行;当执行完一次do 后的语句之后,再提取 SET 中的下一个元素,再执行一次 command,如此循环,直到 SET 中的所有元素都已经被提取完毕,该for 语句才宣告执行结束;

其中,第3 点是最为关键的,它描述了for 语句的执行过程,是for 语句的精髓所在,大家一定要牢记这一条,才能深刻理解更为复杂的for 流程。

下面来看几个例子:

@echo off

for %%i in (one, two, three) do echo %%i

pause

for 命令每一次从 SET 集合中取出一个元素(元素之间通过空白符【tab, 空格或其组合】、逗号、等号作为分隔符), 赋值给 %%i 变量。一直循环,直到 SET 集合中的元素被取完。

(一)  为解析文本而生:for  /f  的基本用法

提取文本信息,是for /f 的拿手好戏:读取文件内容;提取某几行字符;截取某个字符片段;对提取到的内容再切分、打乱、杂糅只要你所能想到的花样,for /f  都会想方设法帮你办到,因为,for /f  就是被设计成专门用于解析文本的。

## a.txt
chrome,firefox,safari
mac,windows,linux

## test.bat
@echo off
for /f %%i in (a.txt) do echo %%i
pause

for 语句依次读取 a.txt 的每一行,作为一个元素赋值给 %%i。也就是说, for /f 默认情况下是以行为单位处理文件内容。 


(二)  设定分隔符,切分文本行: delims=

@echo off
for /f "delims=," %%i in (a.txt) do echo %%i
pause

再次运行,看到什么变化了吗? 只打印出了逗号 【,】 前的一个元素。

在这里,我们引入一个选项, "delims=" 用于指定读取到的行以什么作为分隔符,分割为元素。当然,可以同时指定多个分隔符号: "delims=,|-:" 。如果没有指定 "delims=" ,那么 for /f 默认以空白字符(空格、TAB)序列作为分隔符。

如果我们要打印出除了第一列之外的其他元素,该怎么办呢?


(三)  按需提取元素: tokens=NUM

tokens=x,y,m-n  用于指定提取哪一个字段的数据, NUM 有多种表示形式: 单个数字,即 tokens=2 ; 多个非连续的域,即 tokens=1,3,5;  连续的域, 即 tokens=1-4。

@echo off
for /f "tokens=3 delims=," %%i in (a.txt) do echo %%i
pause

如果我们想一次提取多个字段呢? 那么聪明的你就会想到 tokens=1,3 , ok

@echo off
for /f "tokens=1,3 delims=," %%i in (a.txt) do echo %%i
pause

执行后,你会发现,为什么只显示了第一列的数据?  蒙圈了吧

原来,echo  后面的  %%i  只接收到了  tokens=1,3  中第一个数值1所代表的那一列数据,而第二个数值3 所代表的这一列数据因为没有变量来接收,所以就无法在执行结果中显示出来了。

那么,要如何接收  tokens=  后面多个数值所指代的内容呢?

for /f  语句对这种情况做如下规定: 

如果  tokens=  后面指定了多个数字,如果形式变量为%%i,那么,第一个数字指代的内容用第一个形式变量%%i 来接收,第二个数字指代的内容用第二个形式变量%%j 来接收,第三个数字指代的内容用第三个形式变量%%k 来接

收。第N 个数字指代的内容用第N 个形式变量来接收,其中,形式变量遵循字母的排序,第 N 个形式变量具体是什么符号,由第一个形式变量来决定:如果第一个形式变量是%%i,那么,第二个形式变量就是%%j;如果第一个形式

变量用的是%%x,那么,第二个形式变量就是%%y。

好了, 有了上面的概念, 我们就可以很好的解决刚才的 bug 了。

@echo off
for /f "tokens=1,3 delims=," %%i in (a.txt) do echo %%i %%j
pause

tokens 支持多种形式

tokens=1
tokens=1,3
tokens=1-3
tokens=1-3,7
tokens=1,3-5
还有一种比较怪异的写法

tokens=1,*

其中奥妙就在这个星号上面。 

tokens=后面所接的星号具备这样的功能:字符串从左往右被切分成紧跟在[ * ]之前的数值所表示的字段之后,字符串的其余部分保持不变,整体被*所表示的一个变量接收。

是不是很绕,不好理解, 来看个实例就好了。

@echo off
for /f "tokens=1,* delims=," %%i in (a.txt) do echo %%i %%j
pause

【输出】
chrome firefox,safari
mac windows,linux

理解: 根据delims指定的分隔符对文本行进行切分,tokens=1,* 当切完第一列之后,发现 tokens=1,* 。 1后面跟着 * ,所以就不再进行切分了,整体作为第二列,然后分别传递给 %%i, %%j 变量。

(四)  直奔主题: skip=N

for  /f  允许你跳过无用的行,直接从第N+1 行开始处理,这个时候,就需要使用选项  skip=N,其中,N 是一个正整数,表示要跳过的行数。

(五)  视而不见: eol=CHAR

for /f 允许你跳过某些不想处理的行,只处理有用的数据。这时,就需要使用选项 eol=CHAR。 忽略以指定 CHAR 字符打头的行。

for /f  语句是默认忽略以分号打头的行内容的,正如它默认以空白符作为字符串的切分字符一样。


(六)  执行多条命令

@echo off
for /f "tokens=1,* delims=," %%i in (a.txt) do (
command1
command2
...
)

pause

破译了天机:usebackq  是一个增强型参数,当使用了这个参数之后,原来的for语句中第一个括号内的写法要做如下变动:如果第一个括号里的对象是一条命令语句的话,原来的单引号‘要改为后引号`;如果第一个括号里的对象是字符串的话,原来的双引号"要改为单引号‘;如果第一个括号里的对象是文件名的话,要用双引号"括起来。

三、 net 语句

(一)  利用 net user 命令添加、删除系统本地用户

## 添加用户
net user user_name [user1_passwd] /add 
    /active:no          禁用用户 
    /active:yes         激活用户 
    /passwordchg:yes    用户可以改变密码 
    /passwordreq:yes    用户必须拥有密码 
    /expires:never      帐户永不过期,而不是指密码不过期

## 添加用户组
net localgroup group_name /add

## 把用户添加到组
net localgroup group_name user_name /add

## 把用户从组中删除
net localgroup group_name user_name /del

## 删除用户
net user user_name /del 

常用的例子:
1 添加一个用户到一个组 net localgroup admin 123 /add
2 从一个组删除一个用户 net localgroup admin 123 /del
3 net localgroup 列出本地所有用户组
4 net localgroup administrators  列出特定组的用户

## 批量删除
@echo off
for /f %%i in (user_del.txt) do (
net localgroup group_name %%i /del
net user %%i /del
)

参考:

http://blog.csdn.net/wh_19910525/article/details/7912440

时间: 2024-12-21 05:50:10

cmd 命令行小记的相关文章

调用cmd命令行命令(借鉴)

留待以后观看 ---------------------------------------------------------------------------- public class IP_MAC_TypeHelper { /** * 控制台执行arp -a命令 * * @return * */ public static InputStream getInputStream() { Runtime rt = Runtime.getRuntime(); InputStream in =

如何让Qt程序能在cmd命令行下输出qDebug信息

若让Qt程序能在cmd命令行下输出qDebug()信息, 则在pro文件中增加: WIN32: CONFIG += console 即可. 启动qt程序时会弹出一个cmd框和一个ui框,就可以看到调试信息了.

在CMD命令行下关闭进程的命令

转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos中的作用是一样的) 方法二: ntsd使用以下参数杀死进程.c:\>ntsd -c q -p PID 只要你能提供进程的PID,那么你就可以干掉进程. 法二: tskill命令 这个命令与tasklist命令是相对应的吧! tasklist命令是显示有哪些进程正在运行! tskill命令是关闭运行中的进

Atitit.执行cmd 命令行 php

Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1.4. 回显乱码 2 2. exec,system等函数调用系统命令 2 3. php.ini,关掉安全模式safe_mode = off 3 4. 参考 3 1. 执行cmd 命令行,调用系统命令的基础 1.1. 实际执行模式 Processmonitor 检查.得到.. PID: 115372,

Python实现Windows CMD命令行彩色输出

#! /usr/bin/env python #coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12 # 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色 #由于该函数的限制,应该是只有这16种,可以前景色与背景色组合.也可以几种颜色通过或运算组合,组合后还是在这16种颜色中 # Window

学习笔记-使用cmd命令行创建nodejs项目

使用cmd命令行创建nodejs项目 1)在DOS下cd 进入到你想要创建项目的路径. 2)mkdir sing (创建一个sing文件夹) 3)cd sing 4) npm init (初始化工程) 此时需要填写一些项目信息,你可以根据情况填写,当然也可以一路回车. 5)安装第三方包(后面程序会直接调用包的模块) 说明:由于http模块.fs模块都是内置的包,因此不需要额外添加. 这里安装cheerio包,和request包. 在dos中,cd进入sing文件夹,然后npm install c

Mongodb的备份,恢复,导入与导出(cmd命令行实现)

要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd命令行中输入,导出及备份未指明目录情况下,均保存在当前操作目录下. 数据导出mongoexport 1.常用导出方法:导出数据为json 假设库里有一张area 表,里面有9 条记录,我们要将它导出 >c:\mongo\bin\mongoexport -d iflashbuy_log -c area

Phantomjs 在cmd命令行显示中文乱码

cmd命令行窗口显示中文乱码,多是因为cmd命令行窗口字符编码不匹配导致. 修改cmd窗口字符编码为UTF-8,命令行中执行:chcp 65001 切换回中文:chcp 936 一般情况下 命令行中执行:chcp 65001后

使用cmd命令行方式登录ftp上传下载数据

部分用户在使用ftp工具登录空间上传下载过程中经常会遇到各种问题,如主动模式,被动模式,以及其他导致无法登陆ftp .上传数据.下载数据的问题,这时候不妨使用一下命令行方式.命令行下可以避免很多由于ftp工具配置导致的问题,而且这种方式下下载数据的速率明显比使用ftp工具更快.下面就来看一下如何使用ftp 命令进行简单的上传下载数据.1.登录ftp在“开始”->”运行”中输入“cmd”,进入cmd命令行模式,接下来输入:ftp 118.193.22.151输入自己的网站ip地址,接下来会提示输入