Day 9336 Windows 时钟 UWP 应用旧版本 11.2306.23.0

Windows 10 自带的时钟 UWP 应用在某个版本更新之后,计时器倒计时结束后不会停留在 00:00,而是会继续显示已经经过的时间(按负数时间显示),但是我用不到这个功能,却也没有提供相应的选项关闭,还挺烦人的,总感觉微软现在离用户越来越远了。

由于时钟是用微软的证书签的,“开发者模式”侧载无法搞回旧版本(安装盘里的版本是部署好的,提取很麻烦,也装不回去),而 Store 里的版本又只提供最新版。正准备换软件之际,突然想起先前曾经下载过 11.2306.23.0 版本的原版安装包,在这里留个底,也为可能需要的朋友提供一下。

Day 7448 PE 环境下查看已安装 Windows 环境的网卡 IP 地址

请 LLM 帮忙写的批处理,不进系统查看系统中网络适配器的 IP 地址等配置,适用于固定 IP 环境、原系统贼拉慢或已经进不去的情况。

@echo off
setlocal EnableDelayedExpansion

reg query "HKLM\SYSTEM\CurrentControlSet\Control\MiniNT" >nul 2>&1 || (
    echo.
    echo [!] 此脚本只能在 WinPE 环境下运行
    pause
    exit /b 1
)

set "SYS_DRIVE=C"
set /p SYS_DRIVE=请输入原系统盘盘符回车默认 C): 
set "SYS_DRIVE=%SYS_DRIVE::=%"

if not exist "%SYS_DRIVE%:\Windows\System32\config\SYSTEM" (
    echo.
    echo [!] 未找到 %SYS_DRIVE%:\Windows\System32\config\SYSTEM
    pause
    exit /b 1
)

set "HIVE=HKLM\OFFSYS"
reg load %HIVE% %SYS_DRIVE%:\Windows\System32\config\SYSTEM >nul || (
    echo [!] 加载注册表失败
    pause
    exit /b 1
)

for /f "tokens=3" %%a in ('reg query %HIVE%\Select ^| findstr Current') do (
    set /a CSNUM=%%a
)

if "%CSNUM%"=="1" set CS=ControlSet001
if "%CSNUM%"=="2" set CS=ControlSet002
if "%CSNUM%"=="3" set CS=ControlSet003
if not defined CS set CS=ControlSet001

set "BASE=%HIVE%\%CS%\Services\Tcpip\Parameters\Interfaces"

echo ============================================
echo 离线系统 [%SYS_DRIVE%:] 的网络配置
echo ============================================

for /f "delims=" %%G in ('reg query "%BASE%" 2^>nul') do (

    echo.
    echo --------------------------------------------
    echo 接口%%~nxG
    echo --------------------------------------------

    call :print_value "%%G" "IPAddress"
    call :print_value "%%G" "SubnetMask"
    call :print_value "%%G" "DefaultGateway"
    call :print_value "%%G" "NameServer"
)

reg unload %HIVE% >nul

pause
exit /b

:print_value
set "KEY=%~1"
set "VAL=%~2"

for /f "skip=1 tokens=1*" %%A in ('reg query "%KEY%" /v "%VAL%" 2^>nul') do (
    set "LINE=%%B"
)

if not defined LINE (
    echo %VAL% : ()
) else (
    for /f "tokens=*" %%X in ("!LINE!") do set "VALUE=%%X"
    echo %VAL% : !VALUE!
)
goto :eof

Day 7445 Windows 10 开机输入密码后卡在「欢迎界面」很久才能进入桌面,且进入桌面后没有明显拖慢

问题现象:

Windows 10 系统,开机进入登录界面,输入密码后(或无密码开始自动登录)需要等待相当长的时间(如 5 分钟左右)才能进入桌面,且进入桌面后其他操作没有明显的拖慢。

在事件查看器「Windows日志」的「应用程序」分类中,可以看到来自 Winlogon 的 ID 为 6005 和 6006 的日志:

处理方法:

多是由于临时文件夹下存在大量无用文件导致(本例有 40 余万个),删除临时文件夹(%temp%)下的所有文件即可。

Day 7427 使用树莓派作为 NUT 服务器,同时为群晖和威联通(QNAP)NAS 提供 UPS 服务

很久以前写过一篇文字,记录了当时采用 WinNUT 作为中继,以群晖本身作为 UPS 服务器,向局域网中的其他设备提供自动关机服务。

几年后的今天(实际上是2024年),公司又买了一台威联通(QNAP)的 NAS。由于 UPS 还是只有那一台(APC Back-UPS 650),且群晖和威联通在连接网络 UPS  服务时,使用的账号密码是不同的,虽然也可以通过硬改配置文件来勉强使用,但存在系统更新后被覆盖失效的风险。

经过一点研究,最终决定采用树莓派 Zero 作为 NUT(Network UPS Tool)服务器的方法为两台 NAS 提供网络 UPS 服务。

继续阅读 “Day 7427 使用树莓派作为 NUT 服务器,同时为群晖和威联通(QNAP)NAS 提供 UPS 服务”

Day 7386 查找当前目录及子目录下最长的文件名

这是 Gemini 的作品,但是感觉好像还挺有用的,留个备份。

# 1. 获取当前目录的完整路径
$currentPath = $PWD.Path

# 2. 构造查询语句 (注意 Scope 的路径必须准确)
$query = "SELECT System.FileName, System.ItemPathDisplay FROM SystemIndex " +
         "WHERE Scope = 'file:$currentPath' AND System.FileExtension = '.jpg'"

# 3. 创建 COM 对象连接索引库
$adapter = New-Object -ComObject ADODB.Connection
$recordset = New-Object -ComObject ADODB.Recordset

try {
    $adapter.Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")
    $recordset.Open($query, $adapter)

    $longestName = ""
    $longestPath = ""
    $maxLength = 0

    # 4. 循环遍历结果
    while (-not $recordset.EOF) {
        $name = $recordset.Fields.Item("System.FileName").Value
        $path = $recordset.Fields.Item("System.ItemPathDisplay").Value
        
        # 统计文件名长度不含路径
        if ($name.Length -gt $maxLength) {
            $maxLength = $name.Length
            $longestName = $name
            $longestPath = $path
        }
        $recordset.MoveNext()
    }

    # 5. 输出
    if ($maxLength -gt 0) {
        Write-Host "`n==============================" -ForegroundColor Cyan
        Write-Host "检索成功!"
        Write-Host "字符长度: $maxLength"
        Write-Host "文件名称: $longestName"
        Write-Host "完整路径: $longestPath"
        Write-Host "==============================" -ForegroundColor Cyan
    } else {
        Write-Host "`n[提示] 在索引中未找到该目录下的 .jpg 文件。" -ForegroundColor Yellow
        Write-Host "原因可能是:1. 目录未加入索引;2. 索引尚未构建完成。"
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    # 释放资源
    if ($recordset.State -ne 0) { $recordset.Close() }
    if ($adapter.State -ne 0) { $adapter.Close() }
}

Day 7366 佳能 LBP2900/2900+/3000 打印机状态窗口配置不自动显示

如上是佳能打印机在 Windows 下的 “打印机状态窗口”(Canon Printer Status Window)应用。初次安装佳能 LBP2900/2900+/3000 系列打印机驱动后,每次打印这个窗口都会弹出来提示打印进度。通常对于直连在本机的打印机而言,该窗口不会造成太大影响,

然而,这是一个编写于 2009 年的应用,十几年来,伴随着倒霉催的微软对打印服务子系统的 “修复”,该应用对于 Windows 共享打印机的兼容性逐渐下降,表现为弹出后卡死在“正在获取状态”,打印任务无法开始,虽然强行关闭后可以继续打印,但每次都这样操作未免难受。

2026 年以前,这个问题的解决方案是:当这个窗口出现时,如果在卡顿,就等它卡完,然后点击“选项-首选项”,将“显示打印机状态窗口”配置为“不自动显示”。然而 2026 年的当下,情况起了新变化:

  • 对于 Windows 共享打印机,该窗口卡顿的几率大大增加,且不仅主窗口卡,每一步操作都在卡,甚至可能卡接近一个小时;
  • 甚至本地连接的打印机也开始出现卡顿的情况。

最终,通过分析应用本身(CNAB4SWD.EXE)的 API 调用情况,找到了上述“不自动显示”的选项在注册表中的位置:

\HKEY_CURRENT_USER\SOFTWARE\Canon\CNAB4\打印机名称项\PSW

上述“打印机名称项”位置,如果是本地连接的打印机,通常是打印机本身的名称(如 Canon LBP2900);如果是 Windows 网络共享的打印机,则为类似如下的项名称,请根据实际情况查看:

,,192.168.0.100,Canon LBP2900

在 PSW 项下,找到 Showing 项目(如果没有就新建一个 DWORD 32位值),数据值为 0。

退出注册表编辑器后,再次打印,应该就没有这个状态窗口出来烦人了。

Day 7297 关于某种特殊的 DVD-Video 碟片的抓取

碟片满足以下特征:

  1. 在 DVD 机或 PC 的播放器中,可以正常播放。
  2. 使用通常的手段进行抓取(如格式工厂、MediaCoder 等,或其他常见的 DVD rip 软件),会在抓取第一个节目的少量内容后卡死。
  3. VIDEO_TS 目录下看上去好像有 99 个节目,且文件总大小大大超出盘片本身的容量。

处理方法:

使用 Handbrake 进行抓取,会自动跳过无效的节目。

Day 7282 TxBench 擦除失败后的 ATA 密码清除

有一款叫 TxBench 的工具,可以在 Windows 环境下为磁盘进行测速、安全擦除、信息显示等操作,其中安全擦除功能调用了硬盘本身固件的功能,在启动前会为磁盘加上 ATA 固件锁,而如果由于断电等原因,安全擦除异常中断,会导致磁盘不可用,表现为磁盘在 OS 层面不显示(宛如没有这个硬件一样)、对任何 I/O 操作不响应等。

TxBench 在擦除前不会告知用户设置的固件锁密码,如果擦除异常中断导致硬盘被锁定,需要使用作者提供的工具移除密码。由于软件官网已经下线,感谢 Internet Archive 将这个工具保留了下来,可以在这里下载

Day 7280 罗技 CU0019 接收器(M170、M171、M185、M186、M221)重新配对

适用于接收器型号为 CU0019 的罗技鼠标接收器(见上图)和鼠标背面没有配对按钮的型号(M170、M171、M185、M186、M221等),不需要去下 Logitech Connection Utility,那个是给支持优联技术的鼠标用的。

一、将接收器插入 PC 的 USB 接口。

二、鼠标开关拨到 OFF 位置(记得装电池),先按住右键并保持不动(一直到配对完成为止),然后将开关拨到 ON 位置。

三、保持按住右键的同时,按一下鼠标的左键。

四、保持按住右键的同时,按一下鼠标的滚轮(中键)。

五、连接完成,尝试移动鼠标,应当已经可以看到指针移动了。