Logout

[TOC]

取出Windows聚焦图片

setlocal EnableDelayedExpansion
set flag=0
cd /d "C:\Users\HP\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets"
rem 到源路径,/d 可以跨盘符cd
for %%i in (*) do (
    for /f "delims=" %%j in (E:\HP\Pictures\123\1.txt) do (
        if  %%j==%%i set flag=1)
    if !flag!==0 (
        echo f|xcopy %%i E:\HP\Pictures\123\%%i
        rem echo f|能够提前输入选择,否则这里会问是文件还是文件夹/f /d
        rem 或者尝试用copy命令,不能复制文件夹
        set c=%%~ti
        rem 扩展成文件的时间 例:2020/04/17 08:33
        set d=%%i
        set c=!c:~5,2!!c:~8,2!-!c:~11,2!!c:~14,2!-!d:~0,2!
        rem  c:~5,2取出第5位后2位,即04
        ren "E:\HP\Pictures\123\%%i" "!c!.jpg"
        echo %%i>>E:\HP\Pictures\123\1.txt
        rem >清空并追加 >>末尾追加,不会另起新行
        )
    set flag=0
    )
echo.

替换重命名

set "str1=需要替换的字符串"  
set "str2=替换后的字符串"
Setlocal Enabledelayedexpansion
for /f "delims=" %%i in ('dir /b *.ass') do (
rem 注释 dir /b 使用空格式(没有标题信息或摘要)
rem dir /a:d /b 仅列举文件夹
::for %%i in (*.ass) do (
set "var=%%i" & ren "%%i" "!var:%str1%=%str2%!")

不同变量形式

%0、%i、%%i、var、%var%、!var!

%0

这个是批处理程序中的固定用法,类似于C++程序main函数中argv变量数组,类比可以知道,argv[0]表示exe程序的文件名,argv[1]表示启动程序的第1个参数,后面依次类推。而在批处理程序中%0表示这个批处理程序的文件名,%1表示调用这个批处理时传入的第1个参数,%2表示调用这个批处理时传入的第2个参数,最大可以到%9

%i

在题目所列的这些变量中,这一个比较特殊,因为它不是批处理文件中的变量,只能用于cmd命令行下的for循环中,在命令行中for循环的语法是for %variable in (set) do command [command-parameters],其中的variable只能是单字母或者非特殊含义的字符,同样的for循环语句如果写在批处理文件中variable之前就要加两个%%了,先来看看%i的用法,直接在命令行中遍历集合打印输出

%%i

这种类型也是for循环中特有的,与%i相对,属于批处理程序的用法,如果在命令行中定义需要一个%,如果相同的语句定义在批处理文件中需要2个%%,换句话说就是在for循环中遍历的索引变量,语法为for %%variable in (set) do command [command-parameters],variable同样只能是单个字母或者普通字符,至于为什么同样含义的变量在批处理中要多加一个%,至今也没有找到官方的说法,查找MSDN也没有发现说明,不过就我个人理解可能就像我们在命令行中打印一个%,可以正常打印输出,如果通过printf()想输出%就需要2个%的原理一样吧,

%var%

在批处理中除了上面所说的在set语句后面的两种情况,再要想引用变量就需要在变量两端各加一个百分号%,明确的告诉引用者这是一个变量,使用时需要评估一下值,而不要当成字符串,上一个例子中echo后面想要输出的变量没有加%,那就被当成一个字符串处理,原样输出了

!var!

这是最后一种常见的变量形式,同时也是一种不太好理解的形式,需要记住一点,这种变量与延迟环境变量扩展有关,如果没开启延迟环境变量扩展,那么!var!就是一个普通的包含5个字母的字符串,如果开启了延迟环境变量扩展,那么它就是变量var的实际值,可能说到这有的人会产生疑惑,引用变量var的值不是使用%var%吗?那么在开启延迟环境变量扩展的情况下,%var%和!var!有什么区别呢?下面举个例子测试下,编写如下代码保存在extVar.bat文件中:

@echo off
set var1=110
set var1=120&echo %var1%

运行之后的结果为: 110

@echo off
setlocal enabledelayedexpansion
set var1=110
set var1=120&echo !var1!

运行之后的结果为: 120

ERRORLEVEL

上一命令运行结果,成功为1,失败0

tasklist | find "shuttle_certd3003.exe"
set result=%ERRORLEVEL%
if %result% equ 1 (echo not running)else (echo running)

find|findstr查找

systeminfo | findstr "BIOS"

findstr支持正则

使用sc命令手动管理Windows服务

当需要管理(增加、删除、修改等)Windows系统中的系统服务时,可使用Windows系统提供的sc命令来管理系统服务。 sc命令中的大部分“命令参数”需要“以管理员身份运行”

sc命令格式

sc [server] <command> <ServiceName> [OptionName= "value"] ["option2"] (按照惯例,以上各项参数中,被“中括号 [xxx]”包裹的选项表示为“可选项”,被“尖括号 ”包裹的选项表示为“必需项”;实际命令中不应包括该 中括号或尖括号 符号)

  • server:管理远程机器时,可以是 机器名或IP地址,如: \\\myserver 或 \\\192.168.0.1 。管理本机时可省略此项。
  • command:命令参数。如 create, description, config, query, start, stop, delete 等等(说明:这里可以用普通用户身份执行query命令,未尝试其他未列出的命令参数)。
  • ServiceName:自定义的不可重复的服务名,用于后续操作服务的服务名(类似于数据库记录的唯一主键的作用)。
  • OptionName= "value":“选项名称”和“选项值”,设置相关选项及值。“选项值”可用英文双引号括起来。注意,等号后面必须有一个英文空格;如果命令中的选项值需要进行双引号的嵌套,使用反斜杠加引号 " \" " 来进行转义处理。
  • option2:(无选项名称的)选项值,可用英文双引号括起来。

常用命令分析

(以管理Nginx服务为例) 1. 添加服务 sc create Nginx1.12.0 binpath= "D:\GreenSoftwares\nginx-1.12.0\nginx.exe -p \"D:/GreenSoftwares/nginx-1.12.0\"" DisplayName= "Nginx Web服务器 http://nginx.org" start= delayed-auto * 上面紧跟在create命令后面的 Nginx1.12.0 是自定义的服务名(不能包含空格符); * binpath:启动服务时需要执行的命令(注意在等号右侧必须有一个英文空格,下同); * DisplayName:服务的自定义显示名称; * start:服务的启动类型。如: boot, system, demand (手动启动), auto (自动启动), delayed-auto (自动启动-延迟启动), disabled (禁止启动)。 2. 给服务设置描述信息 sc description Nginx1.12.0 "启动或停止Nginx服务器" * 修改服务配置 使用sc config命令修改已有服务的一项或多项配置信息。 * 修改显示名称: sc config Nginx1.12.0 DisplayName= "Nginx server v1.12.0" * 修改启动类型:sc config Nginx1.12.0 start= auto

  1. 服务状态修改

* 查看服务状态 sc query Nginx1.12.0 * 启动服务 sc start Nginx1.12.0 ,该命令不会输出启动信息(或 net start Nginx1.12.0 ,会输出启动信息) * 停止服务 sc stop Nginx1.12.0,该命令不会输出停止信息 (或 net stop Nginx1.12.0,会输出停止信息) * 删除服务 sc delete Nginx1.12.0

实例

%1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c ""%~s0"" ::","","runas",1)(window.close)&&exit
SETLOCAL enabledelayedexpansion
:menu
cls
echo.
echo   VMware相关服务运行状态:
for /f "delims=" %%i in ('sc query "VMAuthdService"') do (echo %%i |find "STATE" && echo VMAuthdService)
for /f "delims=" %%i in ('sc query "VMware NAT Service"') do (echo %%i |find "STATE" && echo VMware NAT Service)
echo.
set /p mode=           开启或关闭服务:开启(1)/关闭(2): 
if %mode% equ 1 goto sc_enable
if %mode% equ 2 goto sc_disable
:sc_enable
echo.
echo  正在启动。。。
sc start "VMAuthdService">nul
sc start "VMware NAT Service">nul
choice /t 1 /d y /n>nul
goto menu
:sc_disable
echo.
echo 正在停止。。。
sc stop "VMAuthdService">nul
sc stop "VMware NAT Service">nul
choice /t 1 /d y /n>nul
goto menu
pause