Win下批处理技巧

1.错误: 打开文件时出错。可能存在磁盘或文件系统错误。

:处理不在批处理所在目录的执行时,获取%cd%错误问题
:处理非管理员账号下,使用右键"使用管理员方式运行"运行时,如果处理中使用了其它文件时找不到的问题,
:原因是它默认进入的目录是C:\Windows\system32下,而不是批处理的当前目录,当然你也可以使用绝对路径
:但这样脚本就不灵活了.

cd /d %~dp0

2.批处理文件字符集

要使用ANSI编码,不然执行时,中文乱码

3.设置变量时"="号前后不要有空格

如果有空格会导到赋值不成功


rem 错误写法
set us = %USERNAME%
rem 正确写法
set us_1=%USERNAME%

echo %us%
echo %us_1%

pause

4.同时运行多个批处理

使用start命令,如果批处理中有阻塞的命令后的命令将不会执行

start /i  使用i参数将打开新的窗口并行执行,详细信息使用start的帮助获取.

PS C:\Users\Administrator> cmd /c start /?
启动一个单独的窗口以运行指定的程序或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     在窗口标题栏中显示的标题。
    path        启动目录。
    B           启动应用程序,但不创建新窗口。
                应用程序已忽略 ^C 处理。除非应用程序
                启用 ^C 处理,否则 ^Break 是唯一可以中断
                该应用程序的方式。
    I           新的环境将是传递
                给 cmd.exe 的原始环境,而不是当前环境。
    MIN         以最小化方式启动窗口。
    MAX         以最大化方式启动窗口。
    SEPARATE    在单独的内存空间中启动 16 位 Windows 程序。
    SHARED      在共享内存空间中启动 16 位 Windows 程序。
    LOW         在 IDLE 优先级类中启动应用程序。
    NORMAL      在 NORMAL 优先级类中启动应用程序。
    HIGH        在 HIGH 优先级类中启动应用程序。
    REALTIME    在 REALTIME 优先级类中启动应用程序。
    ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
    BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
    NODE        将首选非一致性内存结构(NUMA)节点指定为
                十进制整数。
    AFFINITY    将处理器关联掩码指定为十六进制数字。
                进程被限制在这些处理器上运行。

                将 /AFFINITY 和 /NODE 结合使用时,会对关联掩码
                进行不同的解释。指定关联掩码,以便将零位作为起始位置(就如将 NUMA
                节点的处理器掩码向右移位一样)。
                进程被限制在指定关联掩码和 NUMA 节点之间的
                那些通用处理器上运行。
                如果没有通用处理器,则进程被限制在
                指定的 NUMA 节点上运行。
    WAIT        启动应用程序并等待它终止。
    command/program
                如果它是内部 cmd 命令或批文件,则
                该命令处理器是使用 cmd.exe 的 /K 开关运行的。
                这表示运行该命令之后,该窗口
                将仍然存在。

                如果它不是内部 cmd 命令或批文件,则
                它就是一个程序,并将作为一个窗口化应用程序或
                控制台应用程序运行。

    parameters  这些是传递给 command/program 的参数。

注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。

通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式
创建进程。例如,可以创建两个完全
通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,
从而最大限度地减少内存延迟。只要有可能,
它们就会分配来自相同 NUMA 节点的
内存,并且会在指定节点之外的处理器上自由运行。

    start /NODE 1 application1.exe
    start /NODE 1 application2.exe

这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器
上运行。在以下示例中,application1 在
节点的两个低位处理器上运行,而 application2
,
而无需更改关联掩码。

    start /NODE 1 /AFFINITY 0x3 application1.exe
    启动 /NODE 1 /AFFINITY 0xc application2.exe

如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。
    (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
    关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
     FTYPE 命令。

执行的应用程序是 32 位 GUI 应用程序时,CMD.EXE 不等应用
    程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
    则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
    字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
    防止从当前目录提取 CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
    PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
    名。PATHEXT 变量的默认值是:

        .COM;.EXE;.BAT;.CMD

    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

5.使用管理员权限运行

rem 申请管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

6.vhd虚拟磁盘的使用

  注意点:vhd文件的路径不要使用中文目录,因为使用diskpart命令时,file参数必须指定全路径名,如果路径中有中文将找不到vhd文件而报错.或file参数一定要加双引号,双引号,双引号

常用命令:将list替换成select就变选择命令

############################################################################
# 列出所有磁盘,加"*"为当前选择的磁盘
list disk

  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  磁盘 0    联机             1907 GB  1024 KB        *
* 磁盘 1    联机               50 GB  1024 KB        *

############################################################################

# 只列出虚拟磁盘,加"*"为当前选择的磁盘
list vdisk
  虚拟磁盘 ###  磁盘 ###  状态                  类型       文件
  ------------  --------  --------------------  ---------  ----
* 虚拟磁盘 0       磁盘 1    未打开已连接内容              可扩展         D:\map\map.vhd
  虚拟磁盘 1       磁盘 ---  已添加                   未知          c:\2022.vhd
  虚拟磁盘 2       磁盘 ---  已添加                   未知          D:\3dMap\map.vhd

############################################################################

# 显示卷列表,卷不等同于分区,所以这个信息中不包含完整的分区
list volume
  卷 ###      LTR  标签         FS     类型        大小     状态       信息
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  卷     0     C   Windows-SSD  NTFS   磁盘分区         200 GB  正常         启动
  卷     1     D   Data         NTFS   磁盘分区         274 GB  正常
  卷     2     E   新加卷          NTFS   磁盘分区         500 GB  正常
  卷     3     F   新加卷          NTFS   磁盘分区         930 GB  正常
  卷     4         SYSTEM_DRV   FAT32  磁盘分区         260 MB  正常         系统
  卷     5         WINRE_DRV    NTFS   磁盘分区        2000 MB  正常         已隐藏
  卷     6     K   map        NTFS   磁盘分区          49 GB  正常
  卷     7     J   vhd_2022     NTFS   磁盘分区        1022 MB  正常
############################################################################

# 显示当前选择磁盘的分区信息,可以见到与上面的获取卷信息要多些内容.
list PARTITION

  分区 ###       类型              大小     偏移量
  -------------  ----------------  -------  -------
  分区      1    系统                 260 MB  1024 KB
  分区      2    已保留                 16 MB   261 MB
  分区      3    主要                 200 GB   277 MB
  分区      4    主要                 274 GB   200 GB
  分区      5    恢复                2000 MB   474 GB
  分区      6    主要                 500 GB   476 GB
  分区      7    主要                 930 GB   976 GB

使用diskpart命令创建vhd虚拟硬盘

create vdisk file=c:\2022.vhd MAXIMUM=1024 type=expandable
sel vdisk file=c:\2022.vhd
attach vdisk
create PARTITION primary
format fs=ntfs quick label=vhd_2022
assign letter=h

修改vhd磁盘盘符
  如果报错没有指定卷,一般情况是vhd包含多个分区信息,可先select对应的磁盘,list分区,已确定要修改盘符的分区号,所以相应的sel partition 1要修改为sel partition 2

sel vdisk file=c:\2022.vhd
sel partition 1
assign letter=k

扩展vhd磁盘容量

rem expand vdisk maximum=扩增后的容量(注意单位是MB)

sel vdisk file=c:\2022.vhd
detach vdisk
expand vdisk maximum=10245
attach vdisk
sel vdisk file=c:\2022.vhd
sel partition 1
extend

vhd文件压缩瘦身到实际大小

sel vdisk file=c:\2022.vhd
detach vdisk
sel vdisk file=c:\2022.vhd
attach vdisk readonly
compact vdisk
detach vdisk
attach vdisk

收缩vhd

del DiskPart_compact_temp
echo select vdisk file="E:\vhd_doc.vhd"  >> DiskPart_compact_temp
echo detach vdisk  >> DiskPart_compact_temp
echo attach vdisk readonly  >> DiskPart_compact_temp
echo compact vdisk  >> DiskPart_compact_temp
echo detach vdisk  >> DiskPart_compact_temp
echo attach vdisk  >> DiskPart_compact_temp
 
start /wait diskpart /s DiskPart_compact_temp
del DiskPart_compact_temp

开机附加vhd磁盘

将下面的命令保存到2022.txt文件中

select vdisk file="c:\2022.vhd"
attach vdisk
sel partition 1
assign letter=T

shell:startup :用户启动文件夹
shell:Common Startup  :系统启动文件夹

将命令diskpart.exe /s "2022.txt" 写入一个批处理中,放入上述的其中一个文件夹中,也可以放到计划任务中.

计划任务的好处是不登陆系统就自动加载了磁盘.

7.cmd创建计划任务

f参数:强制覆盖

增加启动的计划任务

schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc onstart  /ru "System" /NP

增加每天定时执行的计划任务

schtasks /create /tn "sys_jh" /tr "cscript //nologo %windir%\System32\slmgr.vbs /ato" /sc daily /st 10:13:00 /ru "system" /f

schtasks /create /sc minute /mo 10 /tn "connect_jenkins" /tr C:\test.bat  /RL HIGHEST /NP /f

8.使用wmic修改环境变量

不管是用注册表和wmic的设置环境变量都在重启或在环境变量的窗口确定才生效.

REM set NVM_HOME=%cd%\nvm
REM set NVM_SYMLINK=%cd%\nodejs

REM set path=%NVM_HOME%;%NVM_SYMLINK%;%path%

@echo off
REM chcp 65001

set NVM_HOME=%cd%\nvm
echo 设置环境变量 NVM_HOME
wmic ENVIRONMENT where "name='NVM_HOME' and username="%computername%\\%username%"" delete
wmic ENVIRONMENT create name="NVM_HOME",username="%computername%\\%username%",VariableValue="%NVM_HOME%"

echo %NVM_HOME%

set NVM_SYMLINK=%cd%\nodejs
echo 设置环境变量 NVM_SYMLINK
wmic ENVIRONMENT where "name='NVM_SYMLINK' and username="%computername%\\%username%"" delete
wmic ENVIRONMENT create name="NVM_SYMLINK",username="%computername%\\%username%",VariableValue="%NVM_SYMLINK%"

echo %NVM_SYMLINK%

echo 设置环境变量 DEVPATHS
set "DEVPATHS=%DEVPATHS%;%%NVM_HOME%%;%%NVM_SYMLINK%%"
wmic ENVIRONMENT where "name='DEVPATHS' and username="%computername%\\%username%"" delete
wmic ENVIRONMENT create name='DEVPATHS',username="%computername%\\%username%",VariableValue="%DEVPATHS%"

echo %DEVPATHS%

REM TASKKILL /IM explorer.exe /F
REM explorer.exe

nvm

pause

9.批处理bat中如何等待几秒后执行下一行程序

rem x为等待的秒数
ping /n x 127.1>nul

常见问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值