Windows 重要使用记录

15 minute

TOC

定时任务

windows 下一般可以通过自带的 SCHTASKS 来执行定时任务。

SCHTASKS 使用规则

 1SCHTASKS /parameter [arguments]
 2
 3Parameter List:
 4    /Create         Creates a new scheduled task.
 5
 6    /Delete         Deletes the scheduled task(s).
 7
 8    /Query          Displays all scheduled tasks.
 9
10    /Change         Changes the properties of scheduled task.
11
12    /Run            Runs the scheduled task on demand.
13
14    /End            Stops the currently running scheduled task.
15
16    /ShowSid        Shows the security identifier corresponding to a scheduled task name.
17
18    /?              Displays this help message.

查询某个操作的具体用法:

1schtasks /create /?
2
3SCHTASKS /Create [/S system [/U username [/P [password]]]]
4    [/RU username [/RP password]] /SC schedule [/MO modifier] [/D day]
5    [/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime]
6    [/RI interval] [ {/ET endtime | /DU duration} [/K] [/XML xmlfile] [/V1]]
7    [/SD startdate] [/ED enddate] [/IT | /NP] [/Z] [/F] [/HRESULT] [/?]
8
9    ...

SCHTASKS 实用例子

每 30 分钟运行一次

1schtasks /create /sc minute /mo 30 /tn "{task_name}" /tr "{task}"

阅读可知, /sc 是指定频率的单位:

1/SC   schedule     Specifies the schedule frequency.
2                    Valid schedule types: MINUTE, HOURLY, DAILY, WEEKLY,
3                    MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT.

/mo, 在 /sc 的基础上, 指定大小(可以的情况下使用, 如 MINUTE 可以, 而 ONSTART 不可以):

 1Modifiers: Valid values for the /MO switch per schedule type:
 2    MINUTE:  1 - 1439 minutes.
 3    HOURLY:  1 - 23 hours.
 4    DAILY:   1 - 365 days.
 5    WEEKLY:  weeks 1 - 52.
 6    ONCE:    No modifiers.
 7    ONSTART: No modifiers.
 8    ONLOGON: No modifiers.
 9    ONIDLE:  No modifiers.
10    MONTHLY: 1 - 12, or
11             FIRST, SECOND, THIRD, FOURTH, LAST, LASTDAY.
12
13    ONEVENT:  XPath event query string.

/tn, 即 “task name”, 注意是 unique 的, 不能与其它任务重名。

/tr, 即 “task run”, 指定任务, 即一个可执行的程序, 如 exe, bat。

开机启动程序

需要通过管理员模式运行以下命令:

1schtasks /create /tn "{task_name}" /sc onlogon /tr "{task}"

每天 22:00:00 执行一次

1schtasks /create /tn "{task_name}" /sc daily /st 22:00:00 /tr "{task}"

阅读可知, /st 是用于指定执行的具体时刻:

1/ST   starttime    Specifies the start time to run the task. The time
2                    format is HH:mm (24 hour time) for example, 14:30 for
3                    2:30 PM. Defaults to current time if /ST is not
4                    specified.  This option is required with /SC ONCE.

删除定时任务

1schtasks /delete /tn "{task_name}"

由于任务名是唯一的, 所以通过 /tn 指定任务名即可删除任务。

右键选项

首先进入注册表界面: win+R -> regedit

增加右键操作文件选项

以 “vscode 作为编辑文件” 作为实例:

在注册表页面下进入:计算机\HKEY_CLASSES_ROOT\*\shell

  1. 新建项 Vscode
  2. 右键 Vscode 并新建项 command
    • 编辑command默认选项值为:${vscodepath}\Code.exe %1 (%1是可选的参数,这里必须要加,表示作用于该文件)
  3. 编辑 Vscode 值
    • 编辑右键显示名称:默认值改为 Open with vscode(不编辑则为新建项的名称)
    • 编辑右键显示图标:新建字符串值icon 添加:${vscodepath}\Code.exe (有些可以这样,但一般为 ico 文件)

增加目录下右键打开选项

以 “window terminal” 作为实例:

注册表页面下进入:计算机\HKEY_CLASSES_ROOT\Directory\Background\shell

  1. 新建项 Terminal
  2. 右键 Terminal 新建项 command
    • 编辑 command 默认选项值为:${terminalpath}\wt.exe
  3. 编辑 Terminal 值
    • 编辑右键显示名称:默认值改为 Open in terminal (不编辑则为新建项的名称)
    • 编辑右键显示图标:新建字符串值 icon 添加:${terminalicon}
  4. 编辑 window terminal 的 json 配置文件
    • 对应位置修改如下,".“即表示当前目录。
1    "profiles": 
2    {
3        "defaults": 
4        {
5            "startingDirectory" : "."
6        },
7    }

唤醒验证

Win11 开启唤醒验证可参考 require-sign-in-option-in-windows-10-is-greyed-out,通过编辑注册表字段即可完成。

进入 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Power\PowerSettings\,在点击其下形如 0e796bdb-100d-47d6-a2d5-f7d2daa51f51 的字段,将其中的 ACSettingIndex(交流电,插电笔记本) 和 DCSettingIndex(直流电,使用笔记本电池) 字段值均改为 1 即可。

WSL

Wsl 在 Windows 开机后自启后台服务

1# /etc/init.wsl
2/etc/init.d/${需要的服务} # 或者使用 service/systemctl 命令

再赋予 init.wsl 执行权限,执行:chmod +x /etc/init.wsl

windows 在启动目录下创建脚本:wsl.bat,写入开机命令如下:

1wsl -d <DistributionName> -u root /etc/init.wsl

其中,版本 <DistributionName> 可通过 wsl -l 查看。

Wsl 修改默认登录用户

将登录默认用户设为 root:

1<DistributionName> config --default-user root

如果 wsl 是手动安装的,经测试似乎无法生效,可通过修改 /etc/wsl.conf 完成:

1# Set the user when launching a distribution with WSL.
2[user]
3default = root

然后重启 wsl 即可完成。

自定义 wsl 安装位置

首先下载 wsl-ubuntu:

  • 20.04版本:https://aka.ms/wslubuntu2004
  • 18.04版本:https://aka.ms/wsl-ubuntu-1804

其他版本自行前往官网查找。

对于下载后得到 AppxBundle 文件,将后缀名改为 zip,然后解压,可以得到一些带系统类型前缀的 appx 文件和其他一些相关文件。

其中,视情况选择 x64 或 ARM64 的安装包,将后缀名改为 zip,然后解压,之后点击解压后文件夹中的 ubuntu.exe 文件,即可开始安装 wsl-ubuntu。

安装完成后在同一目录下可得到虚拟盘:ext4.vhdx

其中安装时会让你指定用户名和密码,这个用户是默认添加到 sudoers 里的。

键位映射

可以通过 PowerToys 实现,下载地址:PowerToys

为适配 Mac 键位体验,将 Win 和 Ctrl 相互映射:

Keyboard Manager -> Remap a key -> 添加 Win to Ctrl, Ctrl to Win

命令别名

CMD 添加别名

可以通过 doskey 命令设置临时的别名。

1doskey ls=echo ====== ^&^& dir /b $* ^&^& echo ======

$* 表示还可能有其他命令参数,^&^& 用于分开多条命令。

单纯在一个 cmd 窗口中使用 doskey 设置别名,别名只能在该窗口中使用。

可以通过将 doskey 命令写入 bat 脚本,再把脚本路径添加到注册表 Autorun 实现永久且所有 cmd 都可用的别名,具体步骤如下:

编写脚本:

1@echo off
2doskey ls=dir /b $*
3doskey lss=echo ====== ^&^& dir /b $* ^&^& echo ======

添加路径到注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 下的 Autorun 中,将数值设为 doskey 命令脚本所在的路径即可。这样所有用户都可以使用设置好的别名。

也可在 HKEY_CURRENT_USER 下的对应位置设置,只针对当前用户设置别名。

通过 doskey 的方式,挺方便的,但是在命令非常多的情况下不是很方便,同时,设置的命令还不可以在 powershell 下运行。

PowerShell 添加别名

为 PowerShell 设置临时的别名:

1PS C:\Users\akyna> set-alias escc esc
2PS C:\Users\akyna> escc
3......

如果带参数,则可以通过 function 进行:

1PS C:\Users\akyna> function func{nircmd emptybin}
2PS C:\Users\akyna> set-alias ctrash func
3PS C:\Users\akyna> ctrash

这样的别名只是在当前会话下有效,开启另一个 shell 就失效了。

可以通过 export-alias my-alias.txt 导出当前会话下的 alias,在其他 shell 中,通过 import-alias my-alias.txt 即可使用。

删除 PwerShell 临时别名:

1PS C:\Users\akyna> remove-item alias:escc
2PS C:\Users\akyna> escc
3escc: The term 'escc' is not recognized as a name of a cmdlet, function, script file, or executable program.
4...

为 PowerShell 设置永久的命令别名:

首先打开 PowerShell ,运行 echo $profile,会输出一个 powershell 配置文件的路径,然后打开文件,按以下格式可以设置多条别名:

1function 别名 { 需要替代的命令可以包含空格 }

e.g.

一个升级 vscode 的命令:

 1# 升级vscode
 2function updatevs {
 3    taskkill /f /t /im code.exe
 4    move D:\a\VSCode* D:\a\vs.zip
 5    Bandizip.exe x -o:"D:\tools3\vscode\Microsoft VS Code" -aoa "D:\a\vs.zip"
 6    del D:\a\vs.zip
 7    code
 8    pause
 9}
10#其他别名
11...

以后,新的别名都可以继续添加在该文件中,非常方便。

最后,需要将 ExecutionPolicy 设为 RemoteSigned。

  • 以管理员身份打开 PowerShell,执行 Set-ExecutionPolicy RemoteSigned
  • 重新启动 PowerShell

对于命令非常多的情况很方便,但是无法在 cmd 下运行别名。

通过添加环境变量的方式设置别名

假如我想通过 exesc 这个命令运行一些操作命令:

  • 在路径 my_path 下新建 exesc.bat 文件,该文件包含了一系列操作命令;
  • 将 my_path 加入环境变量;
  • 命令行即可通过键入 exesc 命令执行 exesc.bat。

以后添加任何命令都可以在这个路径中新建 bat 文件编写别名,非常方便。

这样在 powershell 和 cmd 中都可以使用通过这个方法设置好的别名,但是注意,前提是这个脚本中的命令同时适用于 powershell 和 cmd,比如,如果该脚本中存在一个 ls 命令,但是 cmd 没有这个命令,那么cmd就无法使用该别名,但是你可以先通过上面介绍的 doskey 方法设置好 ls 别名,这样就可以愉快使用了。

个人感觉是很不错的方法,但是一个别名对应一个文件,不是很方便,无法在一个文件中同时指定所有别名。

如果想实现通用性,必须兼顾 cmd 和 powershell 都存在的命令。如果想使用 powershell 很多特有的命令,那么实现通用性是比较麻烦的。

Batch

读取输入

1set /p ch="y/n:"
2echo %ch%

变量运算

通过 %{var}% 访问变量,通过 /a 进行表达式计算设置值。

1@echo off
2
3set money=100
4echo 初始金额: %money%
5
6set /a money=%money%*2
7set /a money=%money%+100
8echo 现在的金额:%money%

选择并跳转

:{point} 用于指定一个跳转点。

 1@echo off
 2
 3set /p ch="y/n:"
 4if "%ch%"=="" (
 5    goto end
 6) else if "%ch%"=="n" (
 7    goto no
 8) else if "%ch%"=="y" (
 9    goto yes 
10) else (
11    goto end
12)
13
14:no
15echo NO
16goto end
17
18:yes
19echo YES
20goto end
21
22:end

循环语句

  • 通过 %%x 设置和访问循环值;
  • 通过 (start, steps, end) 设置循环;
  • /l 将通过比较 start 和 end 来执行迭代。
1@echo off
2
3for /l %%x in (1, 5, 100) do (
4    echo hello, jzh-%%x
5)

变量动态变化

  • setlocal enabledelayedexpansion 开启变量延迟,使得变量可以动态变化;
  • 需通过 !{var}! 访问变化中的量。
 1@echo off
 2@REM 开启变量延迟,使得变量可以动态变化
 3setlocal enabledelayedexpansion 
 4
 5set /a i=1
 6for /l %%i in (1, 1, 10) do (
 7	echo hello
 8	set /a i+=1
 9	echo !i!
10)
11echo %i%

接收参数

1@echo off
2rem %1 即 args[0]
3if "%1" == "a" echo open a.txt 
4
5if "%2" == "b" echo open b.txt

参考