如何批量制作拨动开关?
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
请注意,此方法还允许知道批处理文件使用了多少次,因此它可能用于其他场景...
我需要一个可以在 运行 两个命令行之间切换的批处理文件;
一个人
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
请注意,此方法还允许知道批处理文件使用了多少次,因此它可能用于其他场景...