cmd应用基础 扫盲教程

cmd是什么?

对于程序员而言,cmd命令提示符是windows操作系统下一个比较重要的工具。对于程序员而言,为了追求更高的效率而抛弃花俏的界面已然是意见很常见的行为,截止到目前的,全世界仍有大量的服务器还使用着单一的命令行界面。

使用命令行界面的一个重要因素就是,在远程管理的过程中,命令行操作紧需要传递少量的数据就可以对机器进行操作,如果是图形界面,由于需要传输大量的图形数据,很可能出现延迟、链接不稳定等情况,亦或者在同样情况下效率没有使用命令行界面操作来得高。所以,至今人们依旧离不开命令行操作。

而cmd则是windows系列操作系统下的命令行操作程序(不论是命令行或者是桌面这样的图形界面本质上都是程序)。

命令行界面程序cmd.exe所在的目录是C:\Windows\System32

顺带一提我们的桌面(图形操作界面)则是位于C:\Windows下的explorer.exe

如何打开cmd

方法有很多,以下列举几种

1.打开C:\WindowsSystem32目录,找到cmd.exe双击运行。当然,通常人们都不会这么做。
2.打开开始菜单->运行->输入cmd->回车
3.通过快捷键:win(windows商标键) + r 调出运行框,然后输入cmd回车
4.win7打开开始菜单之后可以直接输入cmd回车

关于当前目录

对于新手而言,这是一个必须要搞清楚的问题。首先我们来学习几个命令:

cd C:\

cd是change directory的简写,意思是改变目录,上面这条命令的意思就是切换到C:\目录下。

可以观察到,cmd界面上的目录变成了C:\

我们可以从图中看到,cmd中的文字有变化,而有变化的地方就是我们要注意的地方。

在每一行的最前面就是当前目录的地址,例如最开始的

C:\Users\Lellansin>cd C:\

这当中”C:\Users\Lellansin”(如你的账户名称是Admin的话就是C:\Users\Admin,注意是win7的默认目录)就是我的当前目录而执行了cd C:\命令之后当前目录就变成了 C:\

当前目录是一个相对重要的概念,因为很多操作只能对当前目录里面的文件进行。就好比,通常情况下,你要操作E盘某个目录下的某个文件,你首先要双击“我的电脑”打开E盘相应的文件夹,找到那个目录才能操作那个目录下的文件一样。对于cmd而言,要操作相应目录下的文件需要切换到相应的目录。

#输入dir回车,系统会返回当前目录下的文件列表
dir

如何执行或打开文件

C:\>1.txt

如果我在C盘根目录下有一个1.txt的文本文件,那么就可以直接输入1.txt回车,即可打开该文件。(这个在linux下也是同样的情况,博主当年也搞不清楚怎么运行程序来着)

同样的,如果存在hello.exe,那么直接输入hello.exe即可运行该程序。当然需要注意的是,某些系统默认的应用程序格式(如.exe文件)在cmd中调用的时候是可以省略后缀的。也就是可以直接输入hello,然后回车也同样可以运行hello.exe。

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等。

常见的环境变量:

变量名			变量值
Path		...太多省略...
OS			Windows_NT
windir		%SystemRoot%
TMP			%SystemRoot%TEMP
ComSpec		%SystemRoot%system32cmd.exe

至于%SystemRoot%的值是什么,大家只要把它复制到文件浏览上面的地址栏里面然后回车就知道了。

环境变量的作用

为系统或者用户程序设置一些默认参数。比如windir这个环境变量,就可能有程序通过读取这个环境变量的值来查看系统的版本。

环境变量的设置方法

1.【我的电脑】->右键【属性】->【高级】->【环境变量】->选中你要修改的环境变量点击【编辑】即可
2.通过cmd设置(不推荐)

path的作用

path是一个很常见得环境变量。主要用来配置系统的默认路径。也就是当你在某个目录下执行某个程序,但是本身目录下却没有这个程序的时候,系统会自动到默认路径下面也去找一找,有没有你要执行的程序。

比如你写了一个hello.exe(编译运行后,能在在程序的相应的debug目录下能找到)。然后把这个hello.exe移动到E:\test目录下,接着

# 切换到E盘
cd E:\
# 切换到E盘下的test文件中
cd test
#执行hello.exe
hello.exe
# 假设程序输出hello world
# 这个时候再切换到E盘根目录下(cd .. 是切换到上级目录)
cd ..
# 再执行hello.exe
hello.exe
# 这个时候系统会提醒你找不到这个命令
# 但是如果你将 E:\test 这个目录加入到 path中,
# 就可以在任意地方运行hello.exe

cmd的常见作用

1.自动关机
2.常看本地ip
3.使用ping
4.快速查询本地服务、端口使用情况
5.快速调用一些常用工具
6.原始编程方式,用cmd调用编译
7.学汇编都应该知道cmd下的debug
8.批处理

自动关机

先说自动关机,貌似很多人都被开过自动关机的玩笑,我们通过cmd就可以实现自动关机命令

#输入shutdown回车可以看到下图效果
shutdown


shutdown并不是一个cmd命令而是一个windows系统自带的程序shutdown.exe,位于C:\WINDOWS\system32目录下,之所以能够直接执行,是因为C:\WINDOWS\system32目录,是系统默认配置在环境变量path中的。其他还有很多的自带程序都在这个目录,以下其他程序不做过多说明。(PS:这里仅仅只讲一些cmd的常见应用,至于cmd的语法之类的,讲了也有些鸡肋,如果想学习批处理再研究也不迟)
废话不多说,我们可以从上面的图片看到,直接输入程序自动给出了一些提示,这些参数告诉了我们这个shutdown.exe要怎么使用

shutdown -s

按照他提示的参数输入这个命令,会弹出提示:

博主是在xp下测试,当然如果是在win7等系统下的话效果会不一样。如果你在实验这个命令,不要慌张马上按照提示执行下面的命令:

#取消关机
shutdown -a

接下来我们来看一下这个程序最常用的方式:

#1小时(3600秒)后关机
shutdown -s -t 3600

博主就经常用到上面这个命令,甚至桌面常备取消关机的批处理(哈哈,当年没少被开过这种玩笑)
好吧,少年,你是要问我批处理是什么嘛?
请你新建一个文件把“shutdown -s -t 3600”复制进去,然后保存,另存为.bat后缀的文件(如何更改文件后缀,不懂请戳度娘谷歌),接着双击这个bat文件。
如果你看到系统提示你一小时后会自动关闭,那么恭喜你,你已经写好了一个自动关机的批处理文件。那么同样的可以想象,取消关机的批处理,就是一个.bat文件,里面写着一行“shutdown -a”,双击一下就可以运行了(批处理的特点之一)。

当然如果,想在C语言中调用这个命令也很简单。
先引入stdlib.h库。接着就可以通过system()命令来调用了,如:

#include<stdio.h>
#include<stdlib.h>
main()
{
    system("shutdown -s -t 3600");
    printf("自动关机已设置!");
}

常看本地ip

通过ipconfig.exe就可以查看本地ip

ipconfig

当然也可以通过 /? 参数获取更多的帮助

ipconfig /?

(PS:博主上面测试的时候写的是help,这个不是一个正确的参数,然后下面那个是弹出来的提示)

当然ipconfig还有很多其他的用处,比如按照提示上面说的
/all Display full configuration information.
通过/all参数调用,可以显示出全部的设置信息:

C:\Documents and Settingsst>ipconfig /all

Windows IP Configuration

        Host Name . . . . . . . . . . . . : s3049
        Primary Dns Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Unknown
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : Realtek PCIe GBE Family Controller
        Physical Address. . . . . . . . . : 78-E3-B5-A3-A5-44
        Dhcp Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 172.26.22.49
        Subnet Mask . . . . . . . . . . . : 255.255.0.0
        Default Gateway . . . . . . . . . : 172.26.2.6
        DNS Servers . . . . . . . . . . . : 58.22.96.66

(直接复制了,发图麻烦)

这里可以查看到一些常见的信息,比如host name是主机名,Physical Address 则是传说中的mac地址,IP Address 就是你的本机地址(注意这个通常是局域网下的)。至于后面的子网掩码还有默认网关什么的,想了解的一可以去搜索一下。
还有/flushdns(flush DNS)刷新DNS缓存什么的。相信这些信息,网管专业的同学应该都非常熟悉。(注:不明情况的围观群众不要随意开跳这个坑,了解基本即可。)

ping命令

记得原来微博上面有个吐槽,就是说很多人普通人用百度来搜索,而很多程序员则用百度来测试网络是否联通。那么如果使用ping.exe来测试网络是否联通:

ping www.baidu.com

除了这个用处以外还有一个很常见的作用就是测试自己是否能够连接到某个ip,这里有一个路由器,连接了两台电脑,在每台电脑上都可以通过ipconfig查看自己在局域网中的ip地址,假设对方的ip是192.168.1.106。那么便可以使用ping命令测试是否能联通对方的电脑。

ping 192.168.1.106

当然,眼尖的同学应该已经发现了ping.exe的另一个作用,那就使用获取某个网站的ip地址:

ping www.bilibili.tv

那么,下面的xxx就是B站的ip地址了。

其他闲话

至于
4.快速查询本地服务、端口使用情况
5.快速调用一些常用工具
6.原始编程方式,用cmd调用编译
7.学汇编都应该知道cmd下的debug
8.批处理

这些有的内容对于新手而言略坑,这里暂不做介绍。

其中的5.快速调用一些常用工具,就简单说一下博主常用的工具:
notepad 记事本
calc 计算器
mspaint 画图板
这些实际上通过菜单调出运行(或者win+r)就可以直接输入调出来。

而其中6.原始编程方式,用cmd调用编译,博主原来有发过一篇相关文章:
使用c语言编译器 CL.exe 在cmd下编译C程序

至于批处理,回头会开个新坑,欢迎学习~

Advertisements

Node 与 windows shell

本文旨在面向Unix的开发者有兴趣学习一点点Windows脚本。并且演示一个从Node调用PowerShell的简单方法。

Windows PowerShell是由三部分组成:一个命令行shell,脚本语言,和NET框架的集成。它同时支持COM和WMI,所以这是一个完美的管理任务自动化工具与脚本设施相结合。有相当多的节点模块,包括shell脚本 – PowerShell是通过友好的Windows方式实现类似的目标。

Unix系统的模块手册,可以通过包含Windows PowerShell的帮助来支持Windows,这实际上只是XML文件。

如果你是一个有Unix的Node开发基础的开发者,并且在寻求Windows上的支持,那么熟悉PowerShell的基本知识是一个好主意。PowerShell可以用来执行程序,并像是在执行一个单独的进程(就像一个Unix shell)一样运行。针对PowerShell 专门设计的NET程序设计被称为cmdlet -同时也被视为“原生”的命令并且在当前d的PowerShell中执行。实际上他支持将输入(input)和输出(output)视作数组一样的对象的集合,并且可以通过管道读取和写入。

使用PowerShell

windows power shell in start menu

我们并不需要安装。如果你使用的是win7操作系统的话,你可以直接在“开始”菜单里面找到Windows PowerShell。同时还有下面Windows PowerShell ISE(编写PowerShell脚本的IDE)。

一旦它加载,你可以尝试发出一些命令。我提到的帮助页面可以访问帮助文档,所以试试输入

get-help get-service


支持Tab键补充单词,所以输入Get-并按下Tab键补完匹配的命令。当然还可以完成参数。

PowerShell还具有Unix风格的命令。Get-ChildItem 命令可以列出文件和目录,就像Unix中的LS。幸运的是,Get-ChildItem是LS的别名,如果你精通Unix shells的话,那么肯定很容易上手。当然这里面,还有有大量的DOS和Unix风格的其他别名:

 Get-Content:   cat
    Get-Help:   man, help
Set-Location:   cd

使用Node来操作PowerShell

接下来就是我一直想要描述的,关于利用PowerShell方便而且快捷的使用Node来编程。

使用Node的child_process模块:

var exec = require('child_process').exec;

//List a directory
exec('powershell.exe -Command "Get-ChildItem"', function(err, stdout, stderr){

console.log(stdout);

})
.stdin.end();

调用的基本形式是powershell.exe -Command “…” 。而结果应该是这样的:

同时,PowerShell还支持使用COM访问对象:

var exec = require('child_process').exec

, script;

// Use COM objects to get filesystem information

script = '$f = new-object -com "scripting.filesystemobject"; $f.drives | where {$_.drivetype -eq 2} | Select Path,AvailableSpace,FreeSpace,TotalSize';

exec('powershell.exe -Command "' + script + '"', function (err, stdout, stderr) {

console.log(stdout);

})

.stdin.end();

这个可以在什么地方用到?好吧,我觉得某些基于Unix开发的程序和模块可以更容易的移植到Windows上来。而Windows开发者也可以不用准备一些额外的程序来使用某些接口(比如虚拟机…笔者注)。

总结

  • PowerShell是一个命令行shell,脚本语言,并且与NET层集成
  • 它有支持的帮助文件,并且是可扩展的
  • 命令经常操作对象,而不是文本,并且对象可以当做通过管道输入输出(pipelined)
  • Forking using the PowerShell binary is possible, which may help port modules that depend on Unix binaries

英文原文地址:
http://dailyjs.com/2012/06/21/windows-and-node-6/

windows 简单的窗口

#include <windows.h>

const char g_szClassName[] = "myWindowClass";

/*
 * 第四步,窗口过程
 */
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	/*
     * 第一步,注册窗口类
     */

    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;   

	// 1)配置窗口属性
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// 2)注册
    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    /*
     * 第二步:创建窗口
     */
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
	
	// 显示窗口
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    /*
     * 第三步:消息循环
     */
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}