Как сделать тумблер в партии? - PullRequest
0 голосов
/ 13 мая 2018

Мне нужен командный файл, который будет переключаться между запуском двух командных строк;

Один из них

nircmd.exe setdefaultsounddevice "Speakers"

Другой -

nircmd.exe setdefaultsounddevice "Headset"

Я пытался использоватьсуществование файла .txt в качестве флага, но по какой-то причине он всегда видит его как несуществующий.Как сделать пакетный файл (без вывода сообщений) при каждом запуске?

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Хорошим решением является сохранение коммутатора в 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
    )

очень просто и не требует никакого временного файла и не имеет ограничения вызовов

0 голосов
/ 13 мая 2018

Вы можете сохранить значение переключателя в самом пакетном файле очень простым способом:

@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

Обратите внимание, что этот метод также позволяет знать, сколько раз был использован пакетный файл, поэтому его можно использовать в другом сценарии ...

0 голосов
/ 13 мая 2018
  • Как бы вы ни назвали следующую партию, она создаст 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

Иногда вам везет, если кто-то находит задачу интересной.

...