我需要一个批处理文件,它将在运行两个命令行之间切换;
一个人
nircmd.exe setdefaultsounddevice "Speakers"
另一个是
nircmd.exe setdefaultsounddevice "Headset"
我尝试使用.txt文件的存在作为标志,但由于某种原因,它总是将其视为不存在。每次运行时如何制作批处理文件(静默)?/
答案 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)
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
如果有人发现任务有问题,有时你很幸运。