Batch file 如何批量制作切换开关?

Batch file 如何批量制作切换开关?,batch-file,switch-statement,toggle,nircmd,Batch File,Switch Statement,Toggle,Nircmd,我需要一个批处理文件,将在运行两个命令行之间切换 一人 nircmd.exe setdefaultsounddevice "Speakers" 另一个存在 nircmd.exe setdefaultsounddevice "Headset" 我试着用一个.txt文件的存在作为标志,但出于某种原因,它总是认为它不存在。如何使批处理文件在每次运行时(以静默方式)滴答作响? 无论您如何命名下一批,它都将在同一位置创建一个同名的Ini文件(最初设置为Speakers) 它使用nircmdsinise

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

一人

nircmd.exe setdefaultsounddevice "Speakers"
另一个存在

nircmd.exe setdefaultsounddevice "Headset"
我试着用一个.txt文件的存在作为标志,但出于某种原因,它总是认为它不存在。如何使批处理文件在每次运行时(以静默方式)滴答作响?

  • 无论您如何命名下一批,它都将在同一位置创建一个同名的Ini文件(最初设置为Speakers)
  • 它使用nircmds
    inisetval
    进行此操作,并将
    Active
    键更改为当前选择

有时,如果有人发现任务有问题,你是幸运的。

  • 无论您如何命名下一批,它都将在同一位置创建一个同名的Ini文件(最初设置为Speakers)
  • 它使用nircmds
    inisetval
    进行此操作,并将
    Active
    键更改为当前选择


有时,如果有人发现任务正在进行测试,您是幸运的。

一个好的解决方案是将开关存储在bat本身的
ADS
(可选数据流)中(仅当您的文件系统是
NTFS
时才起作用):

您只需在第一次运行时收到
文件未找到
警告,同时它可以找到
广告
流,但之后将创建该流

@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
    )

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

一个好的解决方案是将交换机存储在bat本身的
ADS
(可选数据流)中(仅当文件系统为
NTFS
时才起作用):

您只需在第一次运行时收到
文件未找到
警告,同时它可以找到
广告
流,但之后将创建该流

@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
    )

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

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

@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
@echo关闭
setlocal
rem获取当前值并更新它
呼叫:GetToggle
设置/P“=+1”“%~F0”
设置/A“切换%%=2”
如果%切换%equ 0(
回声集“扬声器”
)否则(
回声设置“耳机”
)
后藤:EOF
:GetToggle
rem确保下一行不以CR+LF结尾:
设置/A切换=0
此方法正确工作的次数略少于4096次。如果批处理文件每天运行一次,则覆盖时间超过11年!如果这还不够,只需在获取切换值后添加一个
If
命令,检查其是否超过4090,在这种情况下,在文件末尾插入一个中断的CR+LF字符,然后再插入一行
set/a toggle=0


请注意,此方法还允许了解批处理文件的使用次数,因此它可能用于其他场景…

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

@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
@echo关闭
setlocal
rem获取当前值并更新它
呼叫:GetToggle
设置/P“=+1”“%~F0”
设置/A“切换%%=2”
如果%切换%equ 0(
回声集“扬声器”
)否则(
回声设置“耳机”
)
后藤:EOF
:GetToggle
rem确保下一行不以CR+LF结尾:
设置/A切换=0
此方法正确工作的次数略少于4096次。如果批处理文件每天运行一次,则覆盖时间超过11年!如果这还不够,只需在获取切换值后添加一个
If
命令,检查其是否超过4090,在这种情况下,在文件末尾插入一个中断的CR+LF字符,然后再插入一行
set/a toggle=0


请注意,此方法还允许知道批处理文件被使用了多少次,因此可以在其他场景中使用它…

以包含您尝试的代码,它使用
.txt
文件的存在作为标志,但始终将其视为不存在。如果我们看不到您的失败代码,我们将无法帮助您处理它,不发布它意味着您希望有人为您编写脚本(这既粗鲁又离题)。包含您尝试的代码,它使用
.txt
文件的存在作为标志,但始终将其视为不存在。如果我们看不到您的失败代码,我们将无法帮助您处理它,而不发布它意味着您希望有人为您编写脚本(这既粗鲁又离题)。我刚想建议在第一次运行时使用
if exist
,但不幸的是,我发现这对ADSs不起作用。但是您可以做的是:
2>nul(set/P$activ=<“%~nx0:activ”)| set“$activ=speaker”
。不管怎样,这是一个不错的方法!谢谢@aschipfl!更好更干净!也用你的解决方案编辑!这很有效,但只有效一次。你知道为什么吗?我刚想建议在第一次运行时使用
if exist
,但不幸的是,我发现这对ADSs不起作用。但是您可以做的是:
2>nul(set/P$activ=<“%~nx0:activ”)| set“$activ=speaker”
。不管怎样,这是一个不错的方法!谢谢@aschipfl!更好更干净!也用你的解决方案编辑!这很有效,但只有效一次。你知道为什么吗?如果这段代码不包含“nircmd.exe setdefaultsounddevice”命令,它将如何工作?@KalamalkaKid:这段代码解决了最初的问题,即“如何批量制作切换开关?”。您需要在正确的位置插入相应的
nircmd.exe setdefaultsounddevice
命令。。。提示:
nircmd.exe setdefaultsounddevice“Speakers”
命令位于显示
Set“Speakers”
的行中,而
nircmd.exe setdefaultsounddevice“Headset”命令位于显示
Set“Headset”的行中
如果您只需编辑答案以包含信息,这将非常有用,这样像我这样不太懂编码的人就可以简单地更改设备的名称。我还是不知道该把这些线放在哪里。谢谢nircmd.exe setdefaultsounddevice“扬声器”在echo set之后还是之前?请帮忙,好吗