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 位置。

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

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

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

Day 7181 VGA 转 HDMI、服务器与 VGA 文本模式

公司有一台采购于 2014 年的 DELL PowerEdge R720 服务器,由于各种原因,机房没有在机架上配备 KVM,于是每次出现需要到现场调试的情况(如进 BIOS 修改设置)都要扛一台有 VGA 输入的显示器过去,在不额外花钱采购的前提下,不论是什么背光的型号都又大又重。

某天在一次出现场之前,突然想到之前似乎看到过有 VGA 转 HDMI 的连接线,检索之后选定了山泽的 VH2024,并在去现场之前找了一台机器进行测试,可以“正常使用”,于是抱着一块小尺寸的便携屏美滋滋地去了机房。

然而,当实际到达现场后,发现除了极少数界面以外(例如启动过程中 Initializing firmware interfaces… 的无光标图形模式画面),大部分时间都是在画面一闪而过之后一直黑屏,甚至连 DELL 图形界面的 BIOS 设置和 Lifecycle Controller 都看不到任何画面,偶尔能打开便携显示器 OSD 画面的情况,输入信号显示为 0×0 的分辨率,给人的感觉是从源头上就出了问题。

顺带一提,由于 VGA 转 HDMI 是模拟转数字信号,芯片是主动模式,而 VGA 端子唯一有供电的 pin 9 是否存在无法确保,所以这种转换线缆都会再配一根从 USB 取电的线,本例中,这根供电线是接上了的,所以看不到画面并不是因为没有插供电。

从机房回来后,丧气之余将线缆拆开,发现其中起主要作用的是一颗 MS9288C 芯片。不过,虽然可以很简单地查到这颗芯片的出品方是安徽合肥宏晶微电子科技有限公司,但查不到任何该芯片的 Datasheet(可以查到一份手册,但上面没有关于支持的信号模式的相关信息)。

尝试去问京东客服,对方也只是山泽的销售人员,不清楚具体原因;向芯片出品方宏晶微发邮件咨询,被告知需要留下公司名称方可进行回访,算了算了.jpg

多方搜索后,在这个页面找到了采用同款芯片的产品,其配套说明书如下:

假设说明书上的内容不是乱写的,那么 MS9288C 所支持的输入分辨率包括:

  • 640×480@60/72/75/85Hz
  • 800×600@60/72/75/85Hz
  • 1024×768@60/72/75/85Hz
  • 1152×864@75Hz
  • 1280×720@60Hz
  • 1280×768@60Hz
  • 1280×800@60Hz
  • 1280×960@60Hz
  • 1280×1024@60Hz
  • 1360×768@60Hz ← 没打错字,见上图
  • 1440×1050@60Hz
  • 1440×900@60Hz
  • 1680×1050@60Hz
  • 1600×1200@60Hz
  • 1920×1080@60Hz

很不巧的是,Legacy BIOS 使用的是 VGA 文本模式,其分辨率为 720×400,恰好不在支持范围内。

不幸的是,市面上销售的便宜转接头基本上都没有考虑过这个已经进了故纸堆的分辨率,能支持的基本上也只有 OSSC(Open Source Scan Converter,一款开源的视频信号硬件转换器,国内售价 500 元起跳)这类很贵的设备,而如果只是为了减轻去机房的负重明显就不太值得了。

结论就是,学费 40 元,扛台显示器吧,挺好的。

这里还有一篇文章讲述了类似的情况,比我专业多了,可以做进一步参考。