2017-08-25 101 views
0

脚本启动并通过文件夹“C:\ ProgramData \ WorkingDir”中的文本文件名进行标识,该文件夹是软件将连接到的\当前数据库\正在使用的文件。有一个菜单选项可以继续并按照原来的方式进行连接,或者选择其他数据库。可以简单地通过将当前的workdir内容备份到其自己的文件夹(稍后在切换期间restring)和使用其他选择的文件夹写入workingdir来选择不同的数据库。批处理文件中的上下文感知菜单

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

C:\ ProgramData \工作目录\ Azure.txt

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

C:\文件夹\甲骨文\ 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 

所有的文件夹复制和输入命令很好,只是这个菜单问题。 我曾试着问过这个问题,但过于复杂,有些人与数组关系密切。

+0

只有一个在''C .txt'文件:\ ProgramData \工作目录\'? – Stephan

+0

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

回答

0

使用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 
+0

很酷的感谢,这将有一个发挥和回报!:-) – Tika9o9

+0

仅供参考这篇文章真的很有帮助,不是一个选择的粉丝,所以回到了set/p,但大部分是一样的,把现有的db作为一个选择节省了很多麻烦。很快就会发布。谢谢! – Tika9o9

0

这找到了它自己的数据库(文件夹),所以我们不必对它们进行硬编码。
我们不需要每个数据库的子程序。

@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只能处理sinlge“key”(如果有/可能超过9,切换回set /p)。

(我用的一些信息从您previous question