【问题标题】:How to get the user input using batch script如何使用批处理脚本获取用户输入
【发布时间】:2018-01-11 14:21:35
【问题描述】:

我有 16 个不同的 powershell 脚本来安装应用程序。如何创建单个批处理文件来要求用户输入以选择要运行的 powershell 脚本?

例子:

我只想安装一个应用程序,所以批处理脚本会要求输入,我将输入visualstudio。然后它将运行适当的 powershell 脚本来安装 Visual Studio。

SetLocal
    @echo on   
    :menu   

CHOICE /C VCNE /M "[V]isualStudio, [N]otePad, [c]hrome, [E]xit" 
    set answer=%CHOICE%
    if /i "%answer:~,1%" EQU "V" goto visualstudio
    if /i "%answer:~,1%" EQU "C" goto chrome
    if /i "%answer:~,1%" EQU "N" goto notepad
    if /i "%answer:~,1%" EQU "E" goto Exit


    :chrome
    C:
    cd\
    cd PowerShell
    powershell -file Chrome.ps1
    goto Menu

    :visualstudio
    C:
    cd\
    cd PowerShell
    powershell -file visualstudio.ps1
    goto Menu

    :notepad
    C:
    cd\
    cd PowerShell
    powershell -file visualstudio.ps1
    goto Menu

    :Exit
    exit

【问题讨论】:

  • 在提示符下输入choice /?,这将为您提供您所需要的所有灵活性 - 以及所有单键。
  • 感谢您的评论。尝试了相同的方法,但无论输入是什么,它都会转到 :chrome,
  • 尝试将修改后的代码编辑到您的问题中,以便我们可以看到并可能修复您正在使用的内容。
  • 因为answer是空的,所以陷入:chrome套路; %CHOICE% 来自哪里?您是否阅读了在命令提示符窗口中键入choice /? 时出现的choice 命令的帮助?

标签: batch-file


【解决方案1】:
@echo off
CD /D "C:\Files" 
setlocal enabledelayedexpansion
powershell Set-ExecutionPolicy Unrestricted -force
powershell Set-ExecutionPolicy RemoteSigned
:List
CLS
set /A count=0
set choice=
for /R %%i in (*.ps1) do (
if not "%%~nxi" == "%~nx0" (
set /A count+=1
echo !count!: %%~nxi
set exe[!count!]=%%i
set choice=!choice!!count!
)
)
set /P EXENUM="Enter service number to INSTALL: "
set EXECUTABLE=!exe[%EXENUM%]!
echo running %EXECUTABLE%
pause
PowerShell -File "%EXECUTABLE%"
Pause
GoTo List

【讨论】:

  • 无论文件编号如何,这都会给出准确的结果
  • 这节省了我的整个执行时间,并且工作起来就像一个魅力,我已经根据我的要求编辑了代码
【解决方案2】:

以下示例应在运行时创建菜单:

它通过在C:\Files 目录中搜索.ps1 文件并设置变量以与Set /PPowerShell 命令一起使用来工作。

@Echo Off
CD /D "C:\Files" 2>Nul || Exit /B
If Not Exist *.ps1 Exit /B
SetLocal EnableDelayedExpansion

:Menu
ClS
For /F "Delims==" %%A In ('"Set MO[ 2>Nul"') Do Set "%%A="
Set "i=0"
For %%A In (*.ps1) Do (Set /A i+=1
    Set "MO[!i!]=%%A"
    Echo !i!. %%~nA)

:Retry
Set "MO[S]="
Set /P "MO[S]=Select an item number or press Enter to quit " || Exit /B
If Not Defined MO[%MO[S]%] GoTo Retry
Echo=PowerShell -ExecutionPolicy Bypass -File "!MO[%MO[S]%]!"
Pause
GoTo Menu

注意事项:
上面的示例只会向您展示预期的命令。如果您对输出感到满意,请删除倒数第二行并从其上方的行中删除 Echo= 以实际运行所选的 powershell 脚本。

很明显,您的脚本名称必须足够清晰,以使最终用户清楚他们在选择什么。

您可以修改:
目标目录,在线2(当前C:\Files
可执行文件扩展名,在线3 & 10(当前.ps1)选择提示信息,在线16(当前Select an item number
运行命令,在线18(当前PowerShell -ExecutionPolicy Bypass -File

【讨论】:

  • 这个输出绝对没问题,并且测试脚本,我怎么能解释你使用的命令,我只了解 echo 之类的基础知识,我对 %%~nA 感到困惑,有吗有什么办法知道机制吗?谢谢
  • 您可以在命令提示符后输入每个使用的命令,后跟/? 并阅读使用信息。除此之外,恐怕你必须从自己尝试的东西和外部资源中学习,有许多网站致力于用你喜欢的任何语言编写脚本。
  • 是的,我可以看到所有命令的解释,但不完全是第 7 行和第 9 行,而且我想在退出代码之前安装一些重新分发文件。我确实尝试过最后添加命令但它没有工作,我想如果用户点击退出然后它应该这个文件然后退出,有没有可能?
  • For 是您需要一段时间才能习惯的命令之一,但它会在您编写的几乎所有脚本中使用。慢慢来,别担心,你可能需要一些时间才能得到它。但是,如果您认为您可以绕过繁琐的工作并期望我教您这种脚本语言,作为我回答的一部分,那么不幸的是,您会感到失望。
  • 非常感谢,我有一个问题,如果我有超过 8 个文件,脚本会自动退出,我如何在输入后插入处理文件的代码,是的,你是对的,谢谢对于有价值的 cmets。我将开始学习脚本,这真的很有趣。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
相关资源
最近更新 更多