0

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

一个存在

nircmd.exe setdefaultsounddevice "Speakers"

另一个存在

nircmd.exe setdefaultsounddevice "Headset"

我尝试使用 .txt 文件的存在作为标志,但由于某种原因,它总是认为它不存在。您如何在每次运行时(无声地)制作批处理文件?

4

3 回答 3

4

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

@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

请注意,此方法还可以知道批处理文件已使用了多少次,因此可以在其他情况下使用...

于 2018-05-13T15:26:59.513 回答
2

一个好的解决方案是将开关存储在ADSbat 本身的(替代数据流)中(仅当您的文件系统为 时才有效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
    )

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

于 2018-05-13T13:30:52.270 回答
0
  • 无论您如何命名以下批次,它将在同一位置创建一个具有相同名称的 Ini 文件(最初设置为扬声器)
  • 它为此使用 nircmdsinisetval并且还将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

有时,如果有人发现这项任务很有趣,你会很幸运。

于 2018-05-13T10:46:03.987 回答