我需要一个在运行两个命令行之间切换的批处理文件;
一个存在
nircmd.exe setdefaultsounddevice "Speakers"
另一个存在
nircmd.exe setdefaultsounddevice "Headset"
我尝试使用 .txt 文件的存在作为标志,但由于某种原因,它总是认为它不存在。您如何在每次运行时(无声地)制作批处理文件?
我需要一个在运行两个命令行之间切换的批处理文件;
一个存在
nircmd.exe setdefaultsounddevice "Speakers"
另一个存在
nircmd.exe setdefaultsounddevice "Headset"
我尝试使用 .txt 文件的存在作为标志,但由于某种原因,它总是认为它不存在。您如何在每次运行时(无声地)制作批处理文件?
您可以通过一种非常简单的方式将切换值存储在批处理文件本身中:
@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
请注意,此方法还可以知道批处理文件已使用了多少次,因此可以在其他情况下使用...
一个好的解决方案是将开关存储在ADS
bat 本身的(替代数据流)中(仅当您的文件系统为 时才有效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
)
非常简单,不需要任何临时文件,也没有通话限制
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
有时,如果有人发现这项任务很有趣,你会很幸运。