批处理脚本变量-从文本文件的单行中提取多行变量选项

问题描述 投票:-1回答:2

我正在尝试创建一个批处理文件,用户可以使用该文件将SCCM和RDP连接到不断连接的PC。我可以通过为每台PC编写脚本来轻松地做到这一点,但是我希望这样做的方式是,我拥有一个带有变量的文本文件,就像使用LOOP一样,但是我不需要LOOP,我需要能够选择文本文件的一行。

当前,我有一个选项列表,我用选项手动编辑脚本文件,用户选择一个数字来选择名称,但是我需要删除所有脚本,以便用户不会意外地修改脚本,只有变量。

示例文本文件-(为SCCM和RDP存储用户输入的变量)

Variable1    Variable2     Variable3     Variable4
Description1 ComputerName1 ComputerUser1 ComputerPassword1
Description2 ComputerName2 ComputerUser2 ComputerPassword2
Description3 ComputerName3 ComputerUser3 ComputerPassword3
Description4 ComputerName4 ComputerUser4 ComputerPassword4
Description5 ComputerName5 ComputerUser5 ComputerPassword5
Description6 ComputerName6 ComputerUser6 ComputerPassword6

样本SCCM批处理脚本-(SCCM命令行界面仅允许使用计算机名称,因此我只能提取名称,但我仍然希望SCCM和RDP连接都使用一个文本文件)

Variable1's listed from text file -

Description1
Description2
Description3
Description4
Description5
Description6

Make a selection: ((User enters Variable1))

sccm\CmRcViewer.exe "<variable2>" <-------from a specific line a user selects

示例RDP批处理脚本-(我使用cmdkey来存储用户名/密码,因为mstsc命令行界面仅允许使用该名称,除非我先执行此操作)

Variable1's listed from text file -

Description1
Description2
Description3
Description4
Description5
Description6

Make a selection: ((User enters Variable1))

cmdkey /generic:"<variable2>" /user:"<variable3>" /pass:"<variable4>" <-------from a specific line a user selects
mstsc /v:"<variable2>" /f <-------from a specific line a user selects

非常感谢您的协助。作为免责声明,只有那些对批处理脚本有相当了解的IT人士才能使用它,只是试图使其更易于访问我们不断访问的PC以及我们不断提供远程帮助的用户...

batch-file variables rdp sccm
2个回答
0
投票
@echo off
setlocal enabledelayedexpansion
set x=0

for /f "skip=1 tokens=1-4" %%i in (%~dp0\Choices.txt) do (
  call set /a x+=1
  call set item.%%x%%.1=%%i
  call set item.%%x%%.2=%%j
  call set item.%%x%%.3=%%k
  call set item.%%x%%.4=%%l
)

for /l %%i in (1,1,%x%) do (
  call echo %%i. !item.%%i.1!
)

echo. & set /p sel=Enter Selection:

cmdkey /generic:"!item.%sel%.2!>" /user:"!item.%sel%.3!" /pass:"!item.%sel%.4!"
mstsc /v:"!item.%sel%.2!" /f

0
投票

这是我之前制作的行选择器,它构建包含每个Line值的Array,并允许通过choice命令滚动和选择值。:Load和:Extract标签是与您的需求最相关的功能所在的位置。

编辑:精简后的组件仅针对您要查找的输出进行了修改-使用更安全的输入形式(选择命令)。请注意,如果选项数量超过9,则需要使用Set / P-尽管应该验证输入。

@Echo Off & Setlocal EnableDelayedExpansion
    Set "lines=0"
    Set "Options=E"
    For /f "Skip=1 Tokens=* Delims=" %%A in (%~dp0\Choices.txt) do (
        Set /A lines+=1
        Set "line[!lines!]=%%A"
        Set "Options=!Options!!lines!"
    )
:extract
    Cls
    For /F "Tokens=1,2 Delims==" %%A in ('Set line[') Do (
        Set "Option=%%~A"
        Set "Option=!Option:line=!"
        Echo !Option! %%B
    )
    For /F "Delims=" %%C in ('Choice /N /C %Options%') Do (
        If "%%C" == "E" (Endlocal & Exit /B 0)
        For /F "Tokens=2,3,4 Delims= " %%G in ("!line[%%C]!") Do cmdkey /generic:"%%~G" /user:"%%~H" /pass:"%%~I" & mstsc /v:"%%~G" /f
    )
Goto :extract

使用Set / P时验证输入的示例

    Set /P "INPUT=Selection: "
    For /F "Delims=" %%C in ("!Input!") Do (
        echo.%%C| findstr /R "[^0-9]" >nul 2>nul && Goto :extract
        IF "%%C" == "0" (Endlocal & Exit /B) Else IF "%%C" GTR "%lines%" Goto :extract
        For /F "Tokens=2,3,4 Delims= " %%G in ("!line[%%C]!") Do cmdkey /generic:"%%~G" /user:"%%~H" /pass:"%%~I" & mstsc /v:"%%~G" /f
    )

原始

@Echo off & CD "%~dp0"
TITLE %~n0 & Setlocal

%= Remark =%

    (Set LF=^


%= NewLine variable to split set /p input line =%)

::: / Creates variable /AE = Ascii-27 escape code.
::: - http://www.dostips.com/forum/viewtopic.php?t=1733
::: - https://stackoverflow.com/a/34923514/12343998
:::
::: - /AE can be used  with and without DelayedExpansion.
    Setlocal
    For /F "tokens=2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
        Endlocal
        Set "/AE=%%a"
    )
::: \

%= create blank batch file to store and Selectively retieve variables with =%

    If not Exist "inputURLlog.log" (Break>inputURLlog.log & Goto :main)
    For %%A in ( "%/AE%[36m[%/AE%[34mN%/AE%[36m]ew" , "[%/AE%[34mL%/AE%[36m]oad%/AE%[0m")Do Echo.%%~A
    Choice /N /C nl >nul
    If errorlevel 2 (Goto :load)    
    Goto :Main

:Input <VarName>
    Set "variable=%~1"
    Setlocal EnableDelayedExpansion

:Validate
%= allow input of variable, test input, store for reuse. =%

    Echo(%/AE%[35m
    Set /P "input=!variable!!LF!%/AE%[36m{> %/AE%[33m"
    IF "!input!"=="" (
        Echo(%/AE%[31m!variable! required.
        Goto :Validate
    )
    If "!input!"=="" (Echo(%/AE%[31m!variable! required. & Goto :Validate)
    IF /I "!input!"=="load" (Goto :load)
%= Url Validation - Optional =%
    (ping !input!)>nul || (Echo Invalid url & Endlocal & Goto :main)
    ECHO(!input!>>inputURLlog.log
    Endlocal
    Exit /B

:main
    Call :Input Url
    Goto :main

:load
    Setlocal EnableDelayedExpansion

    Set lines=0
    For /f "Tokens=* Delims=" %%A in (inputURLlog.log) do (
        Set /A lines+=1
        Set "line[!lines!]=%%A"
    )
REM Set "#=%lines%" & REM start from newest entry
    Set "#=1" & REM start from oldest entry
    Echo %#%
:extract

    For %%A in (!#!) do (
    Cls
    Title Option %%A of !lines!
    Echo(Url: !line[%%A]!
    For %%B in ("%/AE%[36m[%/AE%[34mS%/AE%[36m]elect" "[%/AE%[34mN%/AE%[36m]ext" "[%/AE%[34mL%/AE%[36m]ast%/AE%[0m")Do Echo.%%~B
    Choice /N /C LNS /M ""
    If "!errorlevel!"=="3" (Set "Url=!line[%%A]!" & Goto :Selected)
    If "!errorlevel!"=="2" (IF not !#! GEQ !lines! (Set /A #+=1) Else (Set "#=1"))
    If "!errorlevel!"=="1" (IF not !#! LEQ 1 (Set /A #-=1) Else (Set "#=%lines%"))
    )
    Goto :extract

%= Demonstrate that variable has been reloaded =%
:Selected
Echo( Selected Url = !Url!
Pause >nul

© www.soinside.com 2019 - 2024. All rights reserved.