Batch file 多选项批处理文件

Batch file 多选项批处理文件,batch-file,cmd,messaging,optionmenu,Batch File,Cmd,Messaging,Optionmenu,我正在尝试为我们的办公室制作一个简单的messenger程序。 我不确定我遗漏了什么,但每次我尝试运行选项代码时,它只会向我的计算机发送消息,而不是我试图发送的消息。如果我没有简单的选项,我可以向其他计算机发送消息。 请帮忙 我只想选择一个数字,然后让程序将该选择粘贴到提示符。例如,用户选择1,即人员a(人员a的代码为/server:ECRCL)。代码“/server:ECRCL”现在显示在消息代码中的“c”提示符上。(%c%%m%)* 这是我的密码: @echo off Title Doodl

我正在尝试为我们的办公室制作一个简单的messenger程序。 我不确定我遗漏了什么,但每次我尝试运行选项代码时,它只会向我的计算机发送消息,而不是我试图发送的消息。如果我没有简单的选项,我可以向其他计算机发送消息。 请帮忙

我只想选择一个数字,然后让程序将该选择粘贴到提示符。例如,用户选择1,即人员a(人员a的代码为/server:ECRCL)。代码“/server:ECRCL”现在显示在消息代码中的“c”提示符上。(%c%%m%)*

这是我的密码:

@echo off
Title Doodle's Messenger Program
echo Messenger 
chdir /
echo Select a Person
echo 1) Person a
echo 2) Person b
echo 3) Person c
echo 4) Person d

:START
echo ========================================
set /p c=Choose the number of the person you would like to message: 
if %c%=="1" echo /server:ECRCL
if %c%=="2" echo /server:ECRCB
if %c%=="3" echo /server:ECRCCI
if %c%=="4" echo /server:ECRCCO

:A 
set /p m=Message: 
msg * %c% %m% 
GoTo A 

:1
: echo %/server:ECRCL /time:300 /v /w%

:2
:/server:ECRCB

:3
:/server:ECRCCI

:4
:/server:ECRCCO
下面的脚本确实适用于消息传递,但我想让其他人更容易键入
1
2
3
、或
4

@echo Copy one of the following computers you would like to message and paste it where it asks for the computer name.
@echo person a - /server:ECRCL
@echo person b - /server:ECRCB
@echo person c - /server:ECRCCI
@echo person d - /server:ECRCCO

:START
set /p c=Enter Selection:

:A
set /p m=Message:
msg * %c% %m%

GoTo A

这里有一个可能对你有所帮助的例子

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Title Doodle's Messenger Program

Set "msg=%SYSTEMROOT%\System32\msg.exe"
If %PROCESSOR_ARCHITECTURE:~-2% Equ 86 If Defined PROCESSOR_ARCHITEW6432 Set "msg=%SYSTEMROOT%\SysNative\msg.exe"
For %%G In ("%msg%") Do If "%%~aG" Lss "-" (Set "msg=") Else If "%%~aG" GEq "d" Set "msg="
If Not Defined msg (Echo Error! The system file msg.exe is missing.
    "%__AppDir__%timeout.exe" /T 3 /NoBreak 1> NUL
    GoTo :EOF)

:Start
Echo(
Echo Messenger Selection List
Echo 1. Viktor [//ECRCL]
Echo 2. Rashi  [//ECRCB]
Echo 3. Kian   [//ECRCCI]
Echo 4. Cedric [//ECRCCO]
Echo(
"%__AppDir__%choice.exe" /C 1234 /N /M "Enter the number for the user you would like to message." 
If %ErrorLevel% Equ 1 Set "Svr=ECRCL"
If %ErrorLevel% Equ 2 Set "Svr=ECRCB"
If %ErrorLevel% Equ 3 Set "Svr=ECRCCI"
If %ErrorLevel% Equ 4 Set "Svr=ECRCCO"

:AskMessage
Set "m="
Set /P "m=Please type your message, then press the enter key>"
If Not Defined m (
    Echo Empty messages are not allowed!
    "%__AppDir__%timeout.exe" /T 2 /NoBreak 1> NUL
    GoTo AskMessage
)

%msg% * /server:%svr% %m%

GoTo Start

如Compo所述,choice命令是这种菜单样式的选项,但是,可以以更直接的方式使用choice返回的值来执行所需的命令,方法是将索引变量与关联变量相结合,并使用For循环元变量进行延迟扩展,以从索引的收件人编号中提取服务器Id

@Echo Off&Setlocal DisableDelayedExpansion
rem//宏定义
设置“MSG=%SYSTEMROOT%\System32\MSG.exe*”
设置“List/D/V=Set”#$L=0”和设置“$$L=”&如果%%n==2(对于%%G in(!$L!),设置%%G”>Nul&Set/A“#$L+=1”),则设置%%L=”
设置“Div=---------------------------------------------------------------------------------------”
Set“MENU=Echo/!Div!&(For/F”Tokens=1,2 Delims==[“%%X in('Set$V')Do Set/A“CNT=!#%%X!”&Set“Array=%%~Y”)&Set“Choices=”&(For%%A in(!Array!)Do For/L%%U in(11!CNT!)Do Set“Choices=!Choices!%%U”&For%%S in(“!%%A[%%U][%U]!”)Do Echo/%A[%U]%Echo/%S!%S/%E/%
rem//ACTION/E宏使用数组元素的值
设置“ACTION/E=For/F”Delims=“%%I in('Choice/N/C:!Choices!E')如果“%%I”==“E”(Endlocal&Endlocal&Goto:Eof)为(“!Array![%%I]”)中的%%A执行其他操作,则执行$M!%%~A!”
rem//ACTION/S宏使用分配给数组元素值的值(子值)
设置“ACTION/S=For/F”Delims=“%%I in('Choice/N/C:!Choices!E')如果“%%I”=“E”(Endlocal&Endlocal&Goto:Eof)其他为(“!Array![%%I]”)中的%%A执行,为(“!%%A!”中的%%O执行,$M!%%~O!”
Setlocal EnableExtensions EnableDelayedExpansion
rem//定义收件人和服务器之间的关联变量,以允许访问索引变量中的值
%列表/D/V:$L=用户%“收件人[1]=人1”“收件人[2]=人2”“收件人[3]=人3”“收件人[4]=人4”
%列表/D/V:$L=Servers%“Person 1=/server:ECRCL”“Person 2=/server:ECRCB”“Person 3=/server:ECRCCI”“Person 4=/server:ECRCCO”
:循环
CLS
%菜单:$V=用户%
rem//动作宏的不同命令用法示例。$M被替换为对从数组中检索到的值执行的所需命令
rem::%ACTION/E:$M=Echo/%
设置“Input=”&Set/P“Input=输入消息:”
rem:::if not“!input!”==”((if/I”!input!”==“E”(退出/B 0)其他回送/选择收件人&%ACTION/S:$M=Echo/!Msg!%!input!2>Nul)| Echo/!Msg!未安装)其他需要回送/输入
如果不是“!input!”==”((如果/I”!input!”==“E”(退出/B 0)否则回显/选择收件人&%ACTION/S:$M=!Msg!%!input!2>Nul)|回显/!Msg!未安装)否则需要回显/输入
暂停
转到:循环

对上述内容进行了修改,以使宏在不同的菜单使用中更通用。
操作
宏的$M子字符串被替换为对所选索引通过选择返回的值执行的命令

%c%
永远不能等于
“1”
“2”
“3”
,或
“4”
,仅
1
2
3
,或
4
。如果“%c%”=1,则需要此语法。但是,无论如何,您不应该使用
set/p
,您应该使用
选项
命令实用程序。请打开命令提示窗口,键入
选项/?
,按
[输入]
键,并阅读显示的输出。请同时检查
if/?
的输出,您将看到如何正确使用该输出。好的,那么将此脚本转换为上面的选项脚本的最简单方法是什么。选项选项仍然只显示在我的屏幕上,而不显示在其他计算机上。我显示了将你在这两个示例中发布的内容在@Doodle中都不起作用。你可能也应该看看,因为第二个示例中的意图(现在我再次正确格式化了!),是向特定服务器上的每个用户/会话发送消息,而不是像第一个示例中那样向特定用户发送消息。不,在第二个示例中,只有echo是用户应该复制到行上的内容。只有一行(ex/server:ECRCL)应该复制并粘贴到该行上,然后点击回车,您可以向一个人发送消息。程序工作,但是这里的每个人都不知道/记住CTRL C和CTRL P。只是想使它更容易,但是第二代码确实有效。