【问题标题】:Context aware menu in a batch files批处理文件中的上下文感知菜单
【发布时间】:2017-08-25 20:10:01
【问题描述】:

脚本启动并通过文件夹“C:\ProgramData\WorkingDir”中的文本文件名识别,该软件将连接到的当前数据库\一直在使用。有一个菜单选项可以继续并按原样连接,或者选择不同的数据库。只需将当前工作目录内容备份到其自己的文件夹(以便稍后在切换期间重新字符串)并用其他选择的文件夹覆盖工作目录,就可以选择不同的数据库。

所有命名相同的子文件夹和文件 - 内容不同以启用不同的数据库访问。

C:\ProgramData\WorkingDir\Azure.txt

C:\文件夹\Azure\Azure.txt

c:\文件夹\Oracle\Oracle.txt

c:\文件夹\SQL\SQL.txt

因此,我使用 robocopy 将所有内容复制到正确的位置,从而使脚本运行良好。

唯一的问题是菜单切换选项包含当前正在使用的数据库一个选项来切换到看起来很愚蠢。我希望能够从选择中“不存在”使用当前数据库。这是它的样子

Your current database is Azure 
choose 1 to continue 
choose 2 to choose a different database 

extra menu 
Press 1 for Azure 
Press 2 for Oracle 
Press 3 for SQL 

what it needs to do is 'not' give a choice of the current database as it's pointless 

so..(ideally)

Your current database is Azure 
choose 1 to continue 
choose 2 to choose a different database 

extra menu
Press 1 for Oracle
Press 2 for SQL

or 

Your current database is SQL 
choose 1 to continue 
choose 2 to choose a different database 

extra menu
Press 1 for Oracle
Press 2 for Azure

or 


Your current database is ORACLE
choose 1 to continue 
choose 2 to choose a different database 

extra menu
Press 1 for SQL
Press 2 for Azure

NOT 

Your current database is ORACLE
choose 1 to continue 
choose 2 to choose a different database 

Press 1 for SQL
Press 2 for Azure
Press 3 for Oracle 

所有文件夹复制和输入命令都很好,只是这个菜单问题。 我之前试图问过这个问题,但过于复杂了,一些善良的人接近了一个“数组”。

【问题讨论】:

  • `C:\ProgramData\WorkingDir`中只有一个.txt文件?
  • 是的,所以我知道并且脚本知道该文件夹中的配置文件中的数据库是什么,我手动添加了该文本文件。因此,如果我想在 3 甚至 4 之间切换,我知道哪个是哪个,并且可以通过菜单选项复制到工作目录中。希望这是有道理的。因为工作目录的内容是相同的几个文件夹和一个 cfg 文件。文本允许区分。

标签: batch-file command-line cmd


【解决方案1】:

这很容易使用CHOICE 命令。也许我不明白您的部分要求。我没有完成复制文件的练习,因为你说你有这个工作。

至于不让当前数据库作为可能的选择出现,为什么不让它出现呢?如果他们选择它,代码会识别情况而不是复制它。

@ECHO OFF
SET "WORKDIR=C:\ProgramData\WorkingDir"

:MenuHead
SET "CURDB=unknown"
IF EXIST "%WOKDIR%\Azure.txt" (SET "CURDB=Azure")
IF EXIST "%WORKDIR%\Oracle.txt" (SET "CURDB=Oracle")
IF EXIST "%WORKDIR%\SQL.txt" (SET "CURDB=SQL Server")
ECHO Your current database is %CURDB%

CHOICE /C AOSX /M "Choose A=Azure O=Oracle S=SQL Server X=Exit menu"
IF ERRORLEVEL 4 GOTO OutaHere
IF ERRORLEVEL 3 GOTO DoSQLServer
IF ERRORLEVEL 2 GOTO DoOracle
IF ERRORLEVEL 1 GOTO DoAzure

ECHO NB: Unknown selection %ERRORLEVEL%
GOTO MenuHead

:DoSQLServer
IF NOT EXIST "%WORKDIR%\SQL.txt" (
    CALL:BackupCurrent
    ECHO copy SQL Server in
)
GOTO MenuHead

:DoOracle
IF NOT EXIST "%WORKDIR%\Oracle.txt" (
    CALL:BackupCurrent
    ECHO copy Oracle in
)
GOTO MenuHead

:DoAzure
IF NOT EXIST "%WORKDIR%\Azure.txt" (
    CALL:BackupCurrent
    ECHO copy Azure in
)
GOTO MenuHead

:OutaHere
EXIT /B 0

REM ==================

:BackupCurrent

IF EXIST "%WORKDIR%\Azure.txt" (
    echo save off Azure
)
IF EXIST "%WORKDIR%\Oracle.txt" (
    ECHO save off Azure
)
IF EXIST "%WORKDIR%\Azure.txt" (
    ECHO save off SQL Server
)
GOTO :EOF

【讨论】:

  • 仅供参考,这篇文章真的很有帮助,不是一个选择的粉丝,所以已经回到 set /p 但大部分都是一样的,选择现有的 db 节省了很多麻烦。将很快发布。谢谢!
【解决方案2】:

这会自行查找数据库(文件夹),因此我们不必对它们进行硬编码。
我们不需要每个数据库都有一个子例程。

@echo off
setlocal enabledelayedexpansion
set "progdata=C:\ProgramData\Company\WorkingDir"
set "spdir=C:\ProgramData\Company"
REM get current database:
for %%a in (*.txt) do set current=%%~na
REM get possible databases [folders]:
set x=0
set "c="
for /f "delims=" %%a in ('dir /b /ad "%progdata%\*.txt"') do (
  set /a x+=1
  set "m[!x!]=%%a"
  set "c=!c!!x!"
)
REM print menu:
for /l %%a in (1,1,%x%) do (
  echo %%a - !m[%%a]!|find /v /i "%current%"
)
REM ask for new selection:
choice /n /c %c% /m "Select new database: "
set new=!m[%errorlevel%]!
if %new%==%current% (
  echo same - no switching 
  goto :eof
)
REM do the moving:
robocopy "%progdata%" "%spdir%\%current%" /MIR >nul 2>&1 & robocopy "%spdir%\%new%" "%progdata%" /MIR >nul 2>&1
start "" "C:\Temp\Shortcut.lnk" & goto :eof

|find /v /i "%current%" 抑制当前数据库的输出。

注意:数据库(文件夹)不能超过9个,因为我们使用数字,choice只能处理单个“key”(如果有/可能超过9个,切换回set /p) .

(我使用了来自您previous question 的一些信息)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多