如何批量拨动开关?

时间:2018-05-13 09:15:52

标签: batch-file switch-statement toggle nircmd

我需要一个批处理文件,它将在运行两个命令行之间切换;

一个人

nircmd.exe setdefaultsounddevice "Speakers"

另一个是

nircmd.exe setdefaultsounddevice "Headset"

我尝试使用.txt文件的存在作为标志,但由于某种原因,它总是将其视为不存在。每次运行时如何制作批处理文件(静默)?/

2 个答案:

答案 0 :(得分:2)

一个好的解决方案是将交换机存储在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这是避免首次运行的解决方案警告

@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
    )

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

答案 1 :(得分:0)

  • 但是,您命名以下批处理,它将在同一位置创建一个名称相同的Ini文件(最初设置为扬声器)
  • 它为此使用了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

如果有人发现任务有问题,有时你很幸运。