0%

疑难杂症

疑难杂症-头图

如何下载网络视频?Shadowsocks 端口占用怎么办?怎么回放英雄联盟录像文件?难以归类的小知识、冷知识和歪门邪道的大杂烩。


IDEA翻译插件自动忽略星号

在用 IDEA 查看源代码时,习惯使用 Translation 插件翻译大段的英文注释。对于多行注释,直接在文档注释范围内右键,选择「Translate documentation」即可: IDEA-plugin-Translation-1

对于普通的多行注释,Translation 插件则没有提供「Translate documentation」选项。如果选中翻译,会因为星号的存在影响翻译准确度,翻译结果如下:

IDEA-plugin-Translation-2

可以在插件设置中用正则表达式 [/*]+* 忽略,使其不影响翻译效果:

IDEA-plugin-Translation-3

IDEA-plugin-Translation-4

参考资料: 如何使用正则过滤大段注释中的星号

Windows Terminal

“Windows 系统一直缺少个好用的终端”,而 Windows Terminal 的出现正在打破这一观念。它不仅有着现代化的界面,还有完整的字体字符渲染机制,在 Windows Terminal 上运行 Git Bash 也不会中文乱码了。

安装

打开 Microsoft Store,搜索 Windows Terminal 并安装。

![Windows Terminal-install](/Tips/Windows Terminal-install.png)

配置

默认情况下,Windows Terminal 会为我们自动配置本机安装的命令行环境,包括 PowerShell、CMD 以及微软自家的 Azure Cloud Shell,可以通过标签栏旁边的下拉三角选择打开不同的环境。

如果想要对 Windows Terminal 进行配置,比如添加 Git Bash 进来、更改默认环境等,可以点击下拉三角 -> 配置,编辑 settings.json 文件的内容来进行改动。

添加 Git Bash

list 数组中添加一组 Git Bash 的配置。注意修改 commandlineicon 为自己的实际路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
"list": [
{ ... },
// 添加 Git Bash
{
"guid": "{f323ab3c-9641-4904-a3a6-dc4e4992b6ae}",
"name": "Git Bash",
"commandline": "%programfiles%\\Git\\bin\\bash.exe --login",
"hidden": false,
"closeOnExit": true,
"historySize": 9001,
"icon": "%programfiles%\\Git\\mingw64\\share\\git\\git-for-windows.ico"
}
]

更改默认环境

修改 defaultProfile 的值即可。比如想要设置刚才配置的 Git Bash 为默认环境,将 Git Bash 的 guid 粘贴过去即可。

1
2
- "defaultProfile": "{61c54bbd-c2c6-5271-91e7-009a86fd44bf}",
+ "defaultProfile": "{f323ab3c-9641-4904-a3a6-dc4e4992b6ae}",

自动复制选中内容

修改 copyOnSelecttrue 即可:

1
2
3
// If enabled, selections are automatically copied to your clipboard.
- "copyOnSelect": false,
+ "copyOnSelect": true,

快捷键

按住 Alt 键的同时点击设置,可以在默认设置文件 default.json 中看到 Windows Terminal 支持的功能及默认的快捷键:

功能 快捷键
打开设置 Ctrl + ,
打开新的标签页 Ctrl + Shift + T
在新的标签页打开对应的环境 Ctrl + Shift + 1~`9`
复制标签页 Ctrl + Shift + D
切换到下一个标签页 Ctrl + Tab
切换到上一个标签页 Ctrl + Shift + Tab
切换到对应的标签页 Ctrl + Alt + 1~`9`
关闭当前标签页 Ctrl + Shift + W
水平分割当前窗口 Alt + Shift + -
垂直分割当前窗口 Alt + Shift + +

添加到右键菜单

注:微软在 Win10 20H2 后已将 Open in Windows Terminal 添加到右键菜单。

使用批处理脚本一键添加 Windows Terminal 到右键菜单,使用前需检查是否配置以下环境变量:

1
2
cmd> echo %USERPROFILE%
C:\Users\Administrator

MicrosoftTerminalHere.bat 脚本文件内容如下:

MicrosoftTerminalHere.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
:: install or uninstall windows terminal here
:: written by m2nlight
@echo off
setlocal enabledelayedexpansion
set regkey=HKCR\Directory\Background\shell\wt_shell
set regkey2=HKCR\Directory\shell\wt_shell
set exe="%userprofile%\AppData\Local\Microsoft\WindowsApps\wt.exe"
set title=Windows Terminal
set cmdText=Terminal Here
set cmdLine=\"%exe%\"
set icon=
:: check UAC
set getadminfile="%temp%\getadmin.vbs"
echo %title%
echo ============================
echo Starting, please allow UAC window...
>nul 2>nul "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\SYSTEM"
if %ERRORLEVEL% equ 0 (
goto :start
) else (
if %ERRORLEVEL% equ 2 (
goto :pathErr
) else (
goto :getUAC
)
)
:pathErr
echo.
echo Please open "%~n0%~x0" in explorer.exe
echo.
echo Press any key to explore the folder...
pause>nul
start "" "%SYSTEMROOT%\system32\explorer.exe" /select,"%~f0"
goto :eof
:getUAC
echo Set sh = CreateObject^("Shell.Application"^) > %getadminfile%
echo sh.ShellExecute "%~f0", "", "", "runas", 1 >> %getadminfile%
ping 127.1 -n 1 >nul
"%SYSTEMROOT%\system32\cscript.exe" %getadminfile% >nul 2>nul
goto :eof
:start
if exist %getadminfile% ( del %getadminfile% )
cls
rem UAC code end
echo %title%
echo ============================
:: check is installed
reg query "%regkey%" >nul 2>nul
if errorlevel 1 goto :install
goto :uninstall
:install
:: check wt.exe is existed
if not exist "%exe%" (
echo Please install %title%, first!
pause>nul
goto :eof
) else (
:: find WindowsTerminal.exe and set icon
if "%icon%"=="" (
for /f %%i in ('dir /b /w "%programfiles%\WindowsApps\Microsoft.WindowsTerminal_*"') do (
set wtfull=%programfiles%\WindowsApps\%%~i\WindowsTerminal.exe
if exist "!wtfull!" (
set icon=!wtfull!
goto :breakfor
)
)
)
:breakfor
call :regadd "%regkey%"
call :regadd "%regkey2%"
echo %cmdText% is installed
)
goto :end

:regadd
reg add "%~1" /ve /t REG_SZ /d "%cmdText%" /f >nul 2>nul
if not "%icon%"=="" reg add "%~1" /v Icon /t REG_SZ /d "%icon%" /f >nul 2>nul
reg add "%~1\command" /ve /t REG_SZ /d "%cmdLine%" /f >nul 2>nul
goto :eof

:uninstall
set /p ok=Uninstall %title% (y/N)?^
if /i "%ok%"=="y" (
reg delete "%regkey%" /f >nul 2>nul
reg delete "%regkey2%" /f >nul 2>nul
echo %cmdText% is uninstalled
) else (
goto :eof
)
goto :end
:end
timeout /t 5

如果因为升级 Windows Terminal 导致右键菜单中的图标丢失,可以打开注册表修改图标所在的路径:

  1. 运行 regedit 打开注册表编辑器。
  2. 进入 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\wt_shell 以及 计算机\HKEY_CLASSES_ROOT\Directory\shell\wt_shell
  3. 修改 Icon 的值为最新路径。最新路径可以通过以下方式找到:
  • Win + S 输入 wt,右键选择“打开文件所在的位置”
  • 完整路径示例:
    1
    C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.2.2381.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe

注册VSCode右键菜单

添加 VSCode 到右键菜单,实现右键空白处/文件/文件夹,可以选择使用 VSCode 打开的效果:

RegisterVSCode.reg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[HKEY_CLASSES_ROOT\*\shell\VSCode]
@="Open with VSCode"
"Icon"="D:\\VSCodePortable\\Code.exe"

[HKEY_CLASSES_ROOT\*\shell\VSCode\command]
@="\"D:\\VSCodePortable\\Code.exe\" \"%1\""

[HKEY_CLASSES_ROOT\Directory\shell\VSCode]
@="Open with VSCode"
"Icon"="D:\\VSCodePortable\\Code.exe"

[HKEY_CLASSES_ROOT\Directory\shell\VSCode\command]
@="\"D:\\VSCodePortable\\Code.exe\" \"%V\""

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]
@="Open with VSCode"
"Icon"="D:\\VSCodePortable\\Code.exe"

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode\command]
@="\"D:\\VSCodePortable\\Code.exe\" \"%V\""

注:需要替换为实际安装路径

隐藏Windows分类文件夹

Windows 文件资源管理器中的“视频”、“图片”、“文档”、“下载”、“音乐”、“桌面”这几个分类文件夹很少用到,可以通过删除和修改注册表的方式将其隐藏。

方式一

直接删除对应的注册表项,即可将所有分类文件夹隐藏。

  1. Win + R 输入 regedit 打开注册表
  2. 定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace
  3. 删除以下注册表项即可:
    1
    2
    3
    4
    5
    6
    7
    视频:{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}
    图片:{24ad3ad4-a569-4530-98e1-ab02f9417aa8}
    文档:{d3162b92-9365-467a-956b-92703aca08af}
    下载:{088e3905-0323-4b02-9826-5d99428e115f}
    音乐:{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}
    桌面:{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
    3D对象:{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}

方式二

修改对应的注册表项,可以隐藏大多数分类文件夹。新增的“3D对象”文件夹可通过方式一进行删除。

  1. Win + R 输入 regedit 打开注册表
  2. 定位到以下几个注册表项:
    1
    2
    3
    4
    5
    6
    视频:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{35286a68-3c57-41a1-bbb1-0eae73d76c95}\PropertyBag
    图片:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{0ddd015d-b06c-45d5-8c4c-f59713854639}\PropertyBag
    文档:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{f42ee2d3-909f-4907-8871-4c22fc0bf756}\PropertyBag
    下载:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{7d83ee9b-2244-4e70-b1f5-5393042af1e4}\PropertyBag
    音乐:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{a0c69a99-21c8-4671-8703-7934162fcf1d}\PropertyBag
    桌面:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}\PropertyBag
  3. 双击修改 ThisPCPolicy 的值,从 Show 改为 Hide,即可将对应的文件夹隐藏。

隐藏Windows分类文件夹-修改ThisPCPolicy的值

注1:“桌面”对应的 PropertyBag 子项中没有 ThisPCPolicy ,可以右键新建“字符串值”,数值名称为 ThisPCPolicy,数值数据为 Hide

注2:缺少“3D对象”对应的注册表项,可以参考方式一对“3D对象”进行删除。

WSL

如果有使用 VMware Workstation 和 VirtualBox 等第三方虚拟化应用程序的需求,请慎重开启 WSL 功能,可能因为 Intel VT-x 无法与 Hyper-V 共同使用导致无法启动虚拟机。

下载安装

  1. 启用 WSL。在管理员权限运行的 PowerShell 中执行命令后重启 Windows:
1
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  1. 微软商店下载安装 Ubuntu:

微软商店安装Ubuntu

  1. 启动 Ubuntu,设置用户密码。

修改密码

  1. 在 PowerShell 中以 root 身份登录 wsl:
1
wsl -u root
  1. 修改用户密码:
1
passwd your_username

WSL2

如果有使用 VMware Workstation 和 VirtualBox 等第三方虚拟化应用程序的需求,请慎重开启 WSL 功能,可能因为 Intel VT-x 无法与 Hyper-V 共同使用导致无法启动虚拟机。

安装

适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

网络代理

1
2
3
4
5
6
7
8
# 通过以下两种方式可以查看Windows的ip
$ ip route | grep default | awk '{print $3}'
172.24.64.1
$ cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
172.24.64.1

# 可以使用该ip走windows上的网络代理进行下载
curl -O -fsSL -x 172.24.64.1:1080 https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh

禁用Hyper-V

许多第三方虚拟化应用程序无法与 Hyper-V 共同使用,受影响的应用程序包括 VMware Workstation 和 VirtualBox。开启 Hyper-V 后 VMware 就无法选择使用虚拟化引擎 Intel VT-x,导致虚拟机回退到较慢的模拟模式。

若要禁用Hyper-V控制面板中,请按照以下步骤操作:

  1. 在”控制面板”中,选择 “程序和功能”。
  2. 选择 “Windows启用或关闭功能”。
  3. 展开 Hyper-V, 展开Hyper-V Platform”, 然后清除”Hyper-V虚拟机监控 程序 “复选框。
  4. 以管理员权限打开 PowerShell,运行以下命令:
1
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor

参考资料:*虚拟化应用程序无法与 Hyper-V、Device Guard 和 Credential Guard 一起工作 *

Windows端口占用

Windows 系统上的 1080 端口被占用,无法进行网络代理:

  1. 打开命令行,查询占用 1080 端口的 PID。
1
2
$ netstat -aon|findstr 1080
TCP 192.168.0.106:1080 3.0.153.73:443 LAST_ACK 10048 `NVIDIA Share.exe
  1. 打开任务管理器,查看「详细信息」,根据 PID 找到该应用,结束任务。

Iperf3测试WiFi速度

随着智能家居产品数量的增加,原先的 WiFi 4 路由器已不堪重用,因此换用支持 WiFi 5 的路由器,借此机会对 WiFi 5 的网速进行测试。

通过在 PC 上部署内网 Iperf 服务器,手机 APP 作为客户端,以此评估无线局域网和手机 WiFi 性能的真实性能。

工具下载

  • 客户端:HE.NET Network Tools(支持 iOS,Android) 下载地址
  • 服务端:ipref 3(支持 *nix,OSX, Windows) 下载地址

服务器端部署

1
2
3
4
5
6
7
8
9
10
11
$ ./iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.31.5, port 47026
[ 5] local 192.168.31.106 port 5201 connected to 192.168.31.5 port 47028
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 9.73 MBytes 81.6 Mbits/sec
[ 5] 1.00-2.00 sec 11.3 MBytes 94.9 Mbits/sec
[ 5] 2.00-3.00 sec 11.3 MBytes 94.6 Mbits/sec
[ 5] 3.00-4.00 sec 11.3 MBytes 94.9 Mbits/sec

客户端使用

  1. 打开 APP ,点击边栏,选取Iperf3
  2. 填写服务器 IP ,数据大小填 1024M
  3. 开始
1
2
# 等价于如下命令
-c 192.168.31.106 -i 1 -n 1024000.00k -4

服务器端命令行:

1
2
3
-s    表示服务器端;
-p 定义端口号;
-i 设置每次报告之间的时间间隔,单位为秒,如果设置为非零值,就会按照此时间间隔输出测试报告,默认值为零

客户端命令行:

1
2
3
4
5
6
7
8
-c    表示服务器的IP地址;
-p 表示服务器的端口号;
-t 参数可以指定传输测试的持续时间,Iperf在指定的时间内,重复的发送指定长度的数据包,默认是10秒钟;
-i 设置每次报告之间的时间间隔,单位为秒,如果设置为非零值,就会按照此时间间隔输出测试报告,默认值为零;
-w 设置套接字缓冲区为指定大小,对于TCP方式,此设置为TCP窗口大小,对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值;
--logfile 参数可以将输出的测试结果储存至文件中;
-J 来输出JSON格式测试结果;
-R 反向传输,缺省iperf3使用上传模式:Client负责发送数据,Server负责接收;如果需要测试下载速度,则在Client侧使用-R参数即可;

参考资料: 用 iperf 测试手机无线网卡、无线路由器性能

Obsidian笔记

Obsidian,开启半透明效果后,窗口拖动卡顿。

Obsidian-半透明效果

解决方法:关闭 Windows 系统的透明效果。

Obsidian-Win10透明效果

通过

找回新浪图床图片

“新浪图床”开启了防盗链,博客中早期用过的一些图片无法加载出来。如果本地磁盘中没有保留图片原始文件,可以通过替换域名地址的方式先打开图片,再自行保存到本地。

1
2
3
4
5
6
- https://ws1.sinaimg.cn
+ https://cdn.sinaimg.cn.52ecy.cn

# 示例
- https://ws1.sinaimg.cn/large/006N2thZly1fou9wva9iwj30ma09u40a.jpg
+ https://cdn.sinaimg.cn.52ecy.cn/large/006N2thZly1fou9wva9iwj30ma09u40a.jpg

Aegisub

打轴

红线(左键)开始,蓝线(右键)结束,回车提交。

套用特效字幕模板

  1. 打开特效字幕模板文件;
  2. 替换歌词内容;
  3. 自动化 => 应用卡拉OK模板;

Aegisub-卡拉OK模板-自动化执行前后对比

ffmepg切割与合并视频

ffmepg-稿件退回

视频投稿因部分片段版权受限被退回,再渲染一遍耗时耗力,不妨试试用 ffmpeg 对视频进行切割与合并,无需再渲染。

下载安装 ffmpeg

ffmpeg-4.3.1-2020-11-08-full_build.7z

切割

  1. 将待处理视频 20201117.mp4 放入 bin 目录,进入 bash shell;
  2. 使用 -ss 指定切割起始时间,使用 -t 指定经过时间或使用 -to 指定切割结束时间:
    ffmpeg-4.3.1-2020-11-08-full_build/bin/
    1
    2
    $ ./ffmpeg.exe -i 20201117.mp4 -ss 00:00:00.0 -c copy -to 00:25:24 part1.mp4
    $ ./ffmpeg.exe -i 20201117.mp4 -ss 00:28:27.0 -c copy -to 01:02:35.0 part2.mp4

注意:由于视频使用了关键帧,切割得到的视频与参数中的时间并非精准匹配,往往会在开头出现画面静止数秒,只有音频正常播放的情况。

合并

  1. 创建文本文件 list.txt,内容如下:
    ffmpeg-4.3.1-2020-11-08-full_build/bin/list.txt
    1
    2
    file 'part1.mp4'
    file 'part2.mp4'
  2. 使用 concat demuxer 合并多个视频为一个视频:
    ffmpeg-4.3.1-2020-11-08-full_build/bin/
    1
    $ ./ffmpeg.exe -f concat -i list.txt -c copy merge.mp4

录播姬开机自启

  1. 复制录播姬的快捷方式到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 目录下。
  2. 右键点击快捷方式,选择「属性」,在「目标」的值后追加 -w 视频保存位置,「运行方式」选择「最小化」。

B站录播姬属性

回放英雄联盟游戏录像

英雄联盟可以下载对局录像文件,根据官方提供的回放系统的 说明 .rofl 文件的用法如下:

  1. 英雄联盟/Game/ 路径下的 League of Legends.exe 程序创建一个快捷方式。
  2. 将回放文件 *.rofl 拖拽到快捷方式上即可观看。

但现在(2020 年 8 月)使用官方提供的方法进行操作,会启动英文客户端,汉字显示为乱码,需要通过参数指定中文,具体操作如下:

  1. 英雄联盟/Game/ 路径下进入命令行。
  2. 拖拽 League of Legends.exe 到命令行。
  3. 输入空格。
  4. 拖拽回放文件 *.rofl 到命令行。
  5. 输入空格。
  6. 追加参数 -Region=TENCENT -Locale=zh_CN -SkipRads -SkipBuild,回车即可。

示例如下:

/d/Game/WeGameApps/英雄联盟/Game/
1
$ '/d/Game/WeGameApps/英雄联盟/Game/League of Legends.exe' '/c/Users/Administrator/Documents/League of Legends/Replays/WT1_NEW-3219734716.rofl' -Region=TENCENT -Locale=zh_CN -SkipRads -SkipBuild

Photoshop

Photoshop中找不到安装的字体

Windows 上安装的字体在 Photoshop 中“找不到”,但在其他软件中却能找到。举个例子,安装好 EVA 字体 FOT-Matisse Pro,打开 Photoshop,在字体列表输入 Matisse ,提示未找到匹配项。

这时候就需要依次点击:编辑->首选项->文字,勾选「以英文显示字体名称」,就可以找到该字体了。如果取消勾选「以英文显示字体名称」,会发现该字体显示为 FOT-マティス Pro

Photoshop以英文显示字体名称

提取线稿

Photoshop-提取线稿

制作文章头图的时候,需要一张古代医师的透明素材,这里介绍下提取线稿的方法,将 张仲景.jpg 变为 张仲景.png

  1. Photoshop 中打开图片 张仲景.jpg
  2. Ctrl + A 全选图层,Ctrl + C 复制图层;
  3. Q 进入快速蒙版,Ctrl + V 粘贴图层,再按 Q 退出快速蒙版,得到蚂蚁线;
  4. Del 删除选区内容,得到 张仲景.png

Foobar2000

Foobar2000 是 Windows 平台广受好评的音乐播放器,其开放的组件结构允许第三方开发者扩充播放器的功能,比如集成了多种常用插件的 Foobox

Foobox-界面

Foobox 是一个基于 CUI 的 Foobar2000 界面配置,适合大界面使用,可适配高分屏,善于管理曲目数量大的媒体库,对音乐各种封面提供丰富的支持,并扩展了一些网络功能。美观高效实用是 Foobox 的制作目标。

媒体库

在媒体库中添加音乐文件夹,Foobar2000 会监视该目录下音乐文件的变动,搭配上智能列表,可以自适应文件名称的修改,避免出现播放时找不到文件的情况。

Foobox-媒体库

音乐文件夹所在盘符为 B,这里使用了虚拟磁盘,将 Foobar 程序所在目录映射为驱动器 B,将音乐文件放在 Foobar 程序目录下,可以实现便携效果。

Foobox-虚拟磁盘

启用虚拟磁盘后,对歌曲选择“打开所在文件夹”时会提示“位置不可用”,可以通过建立虚拟驱动器映射网络驱动器来解决。

建立虚拟驱动器

subst 命令用来将路径与驱动器号关联,可以在 CMD 中执行:

1
2
3
4
5
6
# 将foobar2000路径与驱动器B:关联
subst b: "E:\Document\foobar2000"
# 查看有效的虚拟驱动器名称
subst
# 删除虚拟驱动器B:
subst b: /d

执行关联后,可以在此电脑中看到虚拟驱动器 B

Foobox-镜像虚拟磁盘完成

使用 subst 建立的关联在重启后会失效,因此需要创建脚本并设为开机启动。

  1. 新建 substFoobar2000.bat 脚本:
substFoobar2000.bat
1
subst B: E:\Document\foobar2000
  1. Win + R 运行 shell:startup 打开启动目录,放入 subst.bat 脚本文件,使其开机启动。

注意:脚本名称不能简单命名为 subst.bat,因为脚本中用到了 subst 命令,会因为名称相同导致脚本递归执行下去,而且因为一直执行的是脚本而不是调用系统命令,无法建立虚拟驱动器 。

映射网络驱动器

  1. 选择“映射网络驱动器”:

Foobox-映射网络驱动器

  1. 选择驱动器为 B:,将 foobar2000 软件的路径作为映射的文件夹,并勾选“登录时重新连接”,避免重启后失效:

Foobox-选择映射文件夹

映射完成,即可通过 B 盘访问 foobar2000 文件夹,“打开所在文件夹”时也不再提示“位置不可用”。

Foobox-网络驱动器映射完成

智能列表

添加播放列表时可以选择添加为智能列表。Foobar2000 会根据查询模板将媒体库中符合条件的歌曲添加进该列表。

Foobox-智能列表

常用的模板有两种:第一种是将指定路径下的所有歌曲添加到列表;第二种是追加了条件,过滤掉缺失了 title 元数据的歌曲,可以避免将单个整轨文件添加进来。

1
2
3
4
# 根据路径添加歌曲到列表
%path% HAS "B:\Music\Pink Floyd"
# 过滤掉元数据中不包含名称的歌曲
%path% HAS "B:\Music\White Album" AND title PRESENT

分组

Foobox 属于 CUI(Column User interface,分栏用户界面) 配置,而非 DUI(Default User Interface,默认用户界面)。

Foobox-显示

如果不满足默认的分组方案,在 DUI 里设置的分组是无法生效的,需要进入 Foobox 设置中新建分组模板。每次更改输入框的内容后需要按 Enter 进行保存。

Foobox-分组

通用模板

Foobox-通用模板效果

通用模板根据专辑进行分组,分组信息显示专辑名称、发布时间、艺术家和音轨数,并根据专辑发布时间进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 标签
通用(发布时间排序/评级排序)
# 标题格式化
%album%%discnumber%
# 排序(按照发布时间排序)
$if2(%date%,'9999') | %album% | %discnumber% | %tracknumber% | %title%
# 排序(按照评级排序)
$sub(5,%rating%) | $if2(%date%,'9999') | %album% | %discnumber% | %tracknumber% | %title%

# 分组标题字段
# 标题第1行,左侧字段
$if(%album%,%album%$if(%discnumber%,$ifgreater(%totaldiscs%,1,' - [光盘 '%discnumber%$if(%totaldiscs%,'/'%totaldiscs%']',']'),),),$if(%length%,'单曲','网络电台'))
# 标题第1行,右侧字段
$if(%date%,$year($replace(%date%,/,-,.,-)),' ')
# 标题第2行,左侧字段
$if2(%album artist%,'未知艺术家')
# 标题第2行,右侧字段
$if2(%genre%,'未知流派')
# 第2行右侧显示音轨数
勾选
# 标题第4行字段(作用未知)
$if2(%comment%,' ')

Anisong模板

Foobox-Anisong模板效果

Anisong 模板根据专辑进行分组,分组信息显示动画名称(用注释字段 commont 进行标注)、发布时间、艺术家、专辑名称、分组时长和分组数,并根据专辑发布时间进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 标签
Anisong(发布时间排序/评级排序)
# 标题格式化
%album%%discnumber%
# 排序(按照发布时间排序)
$if2(%comment%,'未知作品') | $if2(%date%,'9999') | %album% | %discnumber% | %tracknumber% | %title%
# 排序(按照评级排序)
$sub(5,%rating%) | $if2(%comment%,'未知作品') | $if2(%date%,'9999') | %album% | %discnumber% | %tracknumber% | %title%

# 分组标题字段
# 标题第1行,左侧字段
$if2(%comment%,'未知作品')
# 标题第1行,右侧字段
$if(%date%,$year($replace(%date%,/,-,.,-)),' ')
# 标题第2行,左侧字段
$if2(%album artist%,'未知艺术家')
# 标题第2行,右侧字段
$if2(%album%,'未知专辑')
# 第2行右侧显示音轨数
勾选
# 标题第4行字段(作用未知)
$if2(%comment%,' ')

媒体服务器

如果有一台长时间运行的电脑,可以将其作为媒体服务器,局域网内的其他设备可以播放媒体服务器中的音乐。Foobox 没有内置该组件,需要去官网下载安装 foo_upnp

Foobox-UPnP组件

安装好 UPnP 组件后,打开 Android 或 iOS 设备上的 Foobar2000 APP,就可以在 Media Servers 中找到本地网络中的媒体服务器了。

Foobox-媒体服务器-Android

小结

1
2
3
4
5
6
7
8
9
10
11
12
13
# 智能歌单
%path% HAS "B:\Music\周杰伦" AND title PRESENT
%path% HAS "B:\Music\周杰伦"

# 歌曲文件重命名规范
$if(%album%,%album% - ,%artist% - )[%discnumber%.][%tracknumber%.]%title%

# VOCALOID歌曲文件重命名规范
%artist%、%album artist% - %title%

# 根据文件名自动填充元数据
%artist% - %title%
%artist%-%title%

常用字段

一般字段

语法 解释
%title% 音轨标题。若元数据 title 不存在则使用文件名代替。
%artist% 艺术家名。依次检查下列元数据字段:artistalbum artistcomposerperformer
%album artist% 专辑艺术家名。依次检查下列元数据字段:album artistartistcomposerperformer。与 %artist% 不同的是 %album artist% 用于在整张专辑有不同艺术家的情况。
%track artist% 音轨艺术家名。仅在 %album artist% 与 %artist% 不同的时候有效。用于与 %album artist% 共同使用以指定专辑中的不同艺术家,例如: ”%album artist% – %title%[ ‘//’ %track artist%]” ;在这种情况下,最后一部分内容仅会在有根据音轨指定的艺术家存在时才会显示。
%album% 专辑名。依次检查下列元数据字段:albumvenue
%date% 年代。使用元数据 date 字段。
%genre% 流派,使用元数据 genre 字段。
%comment% 注释,使用元数据 comment 字段。个人用来标注 Anisong 对应的动画名称。
%tracknumber% 音轨号。仅在存在元数据 tracknumber 字段时有效。
%totaltracks% 合计音轨。仅在存在元数据 totaltracks 字段时有效。
%discnumber% 光盘编号。仅在存在元数据 discnumberdisc 字段时有效。
%totaldiscs% 合计光盘。仅在存在元数据 totaldiscs 字段时有效。
%codec% 编码格式名。若无法有效取得准确的编码格式,使用文件后缀。
%codec_profile% 关于编码设置的附加信息,并不总是有效。
%filename% 文件名,不包括后缀名和目录
%filename_ext% 文件名,包括后缀名但不包括目录。
%directoryname% 文件所处目录名。
%path% 文件路径,注意排序时应使用 %path_sort% 而非 %path%。
%subsong% 文件内的音轨编号,用于单文件支持多音轨的文件格式(例如章节和CUE)。
%path_sort% 结合了音轨号的文件路径,用于排序;返回值不确定,因此不应依赖其返回值。
%length% 长度,格式为 [HH:]MM:SS。
%length_seconds% 长度,单位为秒,格式是整数。
%bitrate% 比特率,单位为千比特每秒(kbps);支持动态 VBR 比特率。
%channels% 声道数(mono/stereo/etc)。
%samplerate% 采样率,单位为 Hz。
%replaygain_track_gain%, %replaygain_album_gain%, %replaygain_track_peak%, %replaygain_album_peak% 播放增益相关信息。
%filesize% 文件大小,单位为字节。
%filesize_natural% 文件大小,将根据实际情况返回如MB或KB的形式。
%last_modified% 返回文件最后更改时间,格式为 YYYY-MM-DD HH:MM:SS。

上下文字段

语法 解释
%list_index% 指定项目所在的列表编号。应用于:播放列表,由 masstagger/massrenamer 处理过的项目的列表,等等。在结果前补足0以适应列表中最大数的位数。
%list_total% 指定项目所在列表的总项目数。应用于:播放列表,由 masstagger/massrenamer 处理过的列表,等等。
%isplaying% 若当前项目正在播放则有效,例如: 一个播放列表项正在播放。用于 $if() 中的条件。
%ispaused% 若当前项目正在播放并处于暂停状态则有效,例如: 一个播放列表项已暂停。用于 $if() 中的条件。
%playback_time% 当前播放时间,格式为 [HH:]MM:SS。仅在某些使用播放上下文信息的地方有效,例如状态栏。
%playback_time_seconds% 当前播放时间,单位为秒。格式为整数。仅在某些使用播放上下文信息的地方有效,例如状态栏。
%playback_time_remaining% 剩余播放时间,格式为 [HH:]MM:SS。仅在某些会使用播放上下文信息的地方有效,例如状态栏。若当前播放音轨无持续时间信息则无效。
%playback_time_remaining_seconds% 剩余播放时间,单位为秒。格式为整数。仅在某些使用播放上下文信息的地方有效,例如状态栏。若当前播放音轨无持续时间信息则无效。
%queue_index% 指定项目所处队列的编号,仅对播放列表有效。
%queue_indexes% 指定项目所处队列的编号列表,仅对播放列表有效。当指定项目仅在队列中出现一次则与 %queue_index% 等价。
%queue_total% 队列的项目总数。由于技术上的原因该字段仅对属于队列中音轨有效。

函数

语法 解释 示例
$abbr(X) 返回 X 的缩写。 $abbr(%album%)
$abbr(X,Y) 若 X 的长度不大于 Y,则返回 X 的缩写,否则返回 X。 $abbr(%album%,5)
$ansi(X) 返回字符串 X 中属于当前代码页的部分,否则替换为相应最适合的字符。一般用于清理文件名与外部一些对Unicode支持不好的软件交互。 $ansi(%title%), $ansi(%filename%)
$ascii(X) 返回字符串 X 中属于ASCII表部分,否则替换为相应最适合的字符。一般用于与外部一些对Unicode支持不好的软件交互。 $ascii(%title%), $ascii(%filename%)
$lower(X), $upper(X) 将 X 转换到小写/大写。 $upper(%title%)
$num(X,Y) 显示数字 X 并在前补足0使其长度不小于 Y (用于音轨号等)。 $num(%tracknumber%,3)
$caps(X) 将所有单词的第一个字母转换为大写,所有其他字母转换为小写,例如: “blah BLAH” ⇒ “Blah Blah”. $caps(%title%)
$caps2(X) 类似于 $caps,但是不改变已为大写的字母,例如: “blah BLAH” ⇒ “Blah BLAH”. $caps2(%title%)
$if(X,Y,Z) 若 X 包含了至少一个有效字段,则执行/显示 Y, 否则执行/显示 Z。 $if(%artist%,%artist%,unknown artist)
$if2(X,Y) 与 $if(X,X,Y) 相同。
$if3(X,Y,Z,..) 返回首先包含至少一个有效字段的参数。
$ifgreater(A,B,C,D) 若数字 A 大于 B, 则执行/返回 C,否则执行/返回 D。
$iflonger(A,B,C,D) 若字符串 A 长度大于 B,则执行/返回 C,否则执行/返回 D。
$ifequal(A,B,C,D) 若数字 A 等于 B,则执行/返回 C,否则执行/返回 D。
$longest(A,B,C,….) 比较字符串 A,B,C,…并返回最大长度的字符串。 $longest(%title%,%filename%)
$len(X) 返回字符串 X 的长度。
$pad(X,Y), $pad_right(X,Y) 对字符串 X 前/后补足空格使其长度不小于 Y。
$pad(X,Y,Z), $pad_right(X,Y,Z) 对字符串 X 前/后补足字符 Z 使其长度不小于 Y。
$cut(X,Y) 截取 X 使其长度为 Y。
$padcut(X,Y), $padcut_right(X,Y) 对字符串 X 前/后补足空格,并截取结果使其长度不大于 Y。
$insert(A,B,N) 向字符串 A 中 N 个字符后插入字符串 B。
$add(X,Y), $sub(X,Y), $mul(X,Y), $div(X,Y), $mod(X,Y), $min(X,Y), $max(X,Y) 数学运算,依次为:加、减、乘、除、取模、最小值、最大值。
$left(X,Y) 返回字符串 X 的头 Y 个字符。
$right(X,Y) 返回字符串 X 的后 Y 个字符。
$and(X,Y), $or(X,Y), $xor(X,Y), $not(X) 逻辑运算符,依次为:与、或、异或、非。用于与 $if() 协作。
$fix_eol(x), $fix_eol(x,y) 截取多行字符串,在字符串尾添加 ” (…)” (第一个版本) 或 y (第二个版本)。
$meta(X) 返回元数据字段 X 的值。 $meta(artist)
$meta_sep(X,Y), $meta_sep(X,Y,Z) 返回元数据字段 X 中的值,对于多值情况,加上自定义分隔符。 $meta(artist,’, ‘,’ and ‘) ⇒ “artist1, artist2 and artist3”
$meta_num(X) 返回元数据字段 X 中值的数目。
$info(X) 返回名为 X 的技术信息。 $info(bitrate)
$char(X) 插入编号为 X 的 Unicode 字符。 $char(9674)
$strcmp(X,Y) 当字符串 X 和 Y 相同时返回 “1”,否则返回空字符串,用于与 $if() 协同使用。
$stricmp(X,Y) $strcmp(X,Y) 的不区分大小写版本。
$directory(X), $directory(X,N) 从文件路径 X 中提取目录名,附加选项指定提取上 N 级目录名。 $directory(%path%,2)
$directory_path(X) 从文件路径 X 中获取相应目录路径。 $directory_path(%path%)
$greater(X,Y) 比较两个整数,检测是否 X > Y,用于与 $if() 和 逻辑运算符共同使用。
$longer(X,Y) 比较两个字符串,检测是否 X 长度大于 Y,用于与 $if() 和 逻辑运算符共同使用。
$strchr(X,Y) 查找字符串 X 中字符 Y 首先出现位置。
$strrchr(X,Y) 查找字符串 X 中字符 Y 最后出现位置。
$strstr(X,Y) 查找字符串 X 中字符串 Y 中首先出现位置。
$progress2(A,B,C,D,E) 创建进度条。(版本2) $progress2(%playback_time_seconds%,%length%,20,’#’,’=’) ⇒ ”#####===============”
$select(N,A,B,C,….) 返回从 A,B,C… 的第 N 个参数。
$repeat(X,N) 重复X N 次。
$replace(A,B,C) 将字符串 A 中所有出现的字符串 B 替换为字符串 C。
$ext(X) 从文件名/路径 X 中提取后缀名。 $ext(%path%)
$substr(A,B,C) 返回 A 的子串,从第 B 个字符到 第C 个字符。 $substr(blah,1,2) ⇒ “bl”
$trim(A) 移除字符串 A 中首/尾空白字符。 $trim(%title%)
$tab() 生成一个制表符,等同于 $char(9)。参见下面 “Tab(制表符)” 以获取详尽信息。 $tab()
$stripprefix(X) 将前缀 “A” 和 “The” 从X中移除。 $strippefix(%artist%) ⇒ “The Prodigy” 变为 “Prodigy”
$stripprefix(X,prefix1,prefix2,…) 将指定前缀从 X 中移除。 $stripprefix(%artist%,a,the) ⇒ “The Prodigy” 变为 “Prodigy”
$swapprefix(X) 将前缀 “A” 和 “The” 移动到 X 尾。 $swapprefix(%artist%) ⇒ “The Prodigy” 变为 “Prodigy, The”
$swapprefix(X,prefix1,prefix2,…) 将指定前缀移动到 X 尾。 $swapprefix(%artist%,a,the) ⇒ “The Prodigy” 变为 “Prodigy, The”
$year(time) 从时间/日期字符串中得到“年”(格式为4位数字)。 $year(%last_modified%)
$month(time) 从时间/日期字符串中得到“月”(格式为2位数字)。 $month(%last_modified%)
$day_of_month(time) 从时间/日期字符串中得到月中的第几天(格式为2位数字)。 $day_of_month(%last_modified%)
$date(time) 从时间/日期字符串中得到日期信息(格式为 YYYY-MM-DD)。 $date(%last_modified%)
$time(time) 从时间/日期字符串中得到时间信息(格式为 HH:MM:SS 或 HH:MM)。 $time(%last_modified%)

变量操作

  • 变量允许你立即保存文本处理的结果减少冗余格式化文本。
  • 变量不能在多个运行实例中进行交换,并且无法修改实际文件信息。
  • 变量的作用仅仅是缩短过于复杂脚本的尺寸,而不是有其它作用。
语法 解释 示例
$put(name,text) 设置名为 name 的变量的值为 text 并且返回 text “$put(x,blah)” 设置变量 x 为 “blah” 并且返回 “blah”.
$puts(name,text) $put() 的静默版本。与 $put(name,text) 作用相同,但返回空字符串。
$get(name) 返回名为 name 的值,若变量不存在,返回空字符串。 “$puts(x,blah)$get(x)$get(x)” 返回 “blahblah”

其它

语法 解释 示例
[ …. ] 若字段不存在引用则丢弃方括号中的所有内容。主要用于创建部分仅在相关字段有效时的格式化脚本。 %artist% – [%album% / ]%title%
‘ (单引号) 插入指定文本忽略语法处理;允许有特殊字符比如”%”、”$”、”[“和”]”。若需要在文本中插入单引号,可以使用 ” (两个单引号)。
// 注释,仅能用于行首;注释后的文本从行首到行尾不会被解析。
EOL字符 忽略; 你可以使你的脚本拆分为多行以增加可读性,而不会影响结果。
Tab(制表符) 用于对特定上下文文本进行对齐,例如状态栏。参见: $tab() %title%$tab()%length%
颜色控制: < > 用于控制文本颜色的深浅,现在可用于播放列表和状态栏.深浅都有3个级别,可通过重复颜色控制字符控制级别. <浅> >深< >>更深<<
  • 本文作者: SANNAHA
  • 本文链接: https://sannaha.moe/Tips/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!