如何批量制作拨动开关?

How to make a toggle switch in batch?

我需要一个可以在 运行 两个命令行之间切换的批处理文件;

一个人

nircmd.exe setdefaultsounddevice "Speakers"

另一个

nircmd.exe setdefaultsounddevice "Headset"

我试过使用 .txt 文件的存在作为标志,但出于某种原因,它总是认为它不存在。每次运行时如何创建一个批处理文件(静默地)tick/tock?

  • 无论您如何命名以下批次,它都会在同一位置创建一个同名的 Ini 文件(初始设置为 Speakers)
  • 为此使用 nircmds inisetval,并将 Active 键更改为当前选择

:: ToggleSnd.cmd
@Echo off
set "NC="
::check nircmd
for /f "delims=" %%A in ("nircmd.exe") do Set "NC=%%~f$PATH:A"
if Not defined NC (Echo Can't Locate nircmd.exe&Pause&Exit /B 1)
Set "Ini=%~dpn0.Ini"

If Not Exist "%Ini%" goto :Speakers
:: get current selection
For /f %%A in ('Findstr /i "Active" %Ini%') Do Set "%%A"
if /I "%Active%"=="Headset" goto :Speakers

:: switch to Headset
%nc% setdefaultsounddevice "Headset"
%nc% inisetval "%Ini%" DefaultSoundDevice Active Headset
Echo switched to Headset
Goto :Eof

:Speakers
%nc% setDefaultSoundDevice "Speakers"
%nc% inisetval "%Ini%" DefaultSoundDevice Active Speakers
Echo switched to Speakers

有时候,如果有人发现任务很有趣,那你就很幸运了。

一个好的解决方案是将开关存储在 bat 本身的 ADS(替代数据流)中(仅当您的文件系统是 NTFS 时才有效):

您只会在第一个 运行 处收到 file not found 警告,而它可以找到 ADS 流,但之后会创建

@echo off

set "$activ="
set /p $activ=<%~nx0:activ

if not defined $activ (
    echo speaker>%~nx0:activ
    set "$activ=speaker"
    )

echo actual [%$activ%]

if /i "%$activ%"=="speaker" (
    nircmd.exe setdefaultsounddevice "Headset"
    echo headset>%~nx0:activ
    ) else (
    nircmd.exe setdefaultsounddevice "Speakers"
    echo speaker>%~nx0:activ
    )

编辑:谢谢@aschipfl这是避免第一个运行警告[=17的解决方案=]

@echo off
set "$activ="

2> nul (set /P $activ= < "%~nx0:activ") || set "$activ=speaker"

echo actual [%$activ%]

if /i "%$activ%"=="speaker" (
    nircmd.exe setdefaultsounddevice "Headset"
    echo headset>%~nx0:activ
    ) else (
    nircmd.exe setdefaultsounddevice "Speakers"
    echo speaker>%~nx0:activ
    )

非常简单,不需要任何临时文件,也没有调用限制

您可以通过一种非常简单的方式将切换值存储在批处理文件本身中:

@echo off
setlocal

rem Get current value and update it
call :GetToggle
set /P "=+1" < nul >> "%~F0"
set /A "toggle%%=2"

if %toggle% equ 0 (
   echo Set "Speakers"
) else (
   echo Set "Headset"
)

goto :EOF

:GetToggle
rem Be sure that next line does NOT end in CR+LF:
set /A toggle=0

此方法正常运行不到4096次。如果批处理文件 运行 每天一次,这将超过 11 年!如果这对你来说还不够,只需在获取切换值后添加一个 if 命令来检查它是否超过 4090,在这种情况下,在文件末尾插入一个中断的 CR+LF 字符,然后是一个新的符合 set /A toggle=0

请注意,此方法还允许知道批处理文件使用了多少次,因此它可能用于其他场景...