2017-08-25 11 views
0

スクリプトが起動し、\ C:\ ProgramData \ WorkingDirフォルダ内のテキストファイル名を使用して、ソフトウェアが\に接続する現在のデータベースが使用されていることを確認します。それまでと同じように接続したり、別のデータベースを選択したりするメニュー選択肢があります。別のデータベースは、現在の作業ディレクトリの内容を自分のフォルダにバックアップする(切り替え時に後で復元する)ために、他の選択肢のフォルダを使用して作業ディレクトリを書き込むことによって選択できます。バッチファイル内のコンテキスト認識メニュー

same-contentsという名前のすべてのサブフォルダとファイルは、異なるデータベースアクセスを可能にするために異なります。

C:\はProgramData \ WORKINGDIR \ 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 \ WORKINGDIR \は '? – 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

FYIこの記事は本当に参考になりましたので、選択肢のファンではなく、/ pを設定するために戻ってきましたが、そのほとんどは同じですが、選択肢としてexisitng 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%"は、現在のデータベースの出力を抑制します。

注:(存在する場合/バックset /pに切り替え、9個以上の場合もある)が、我々は数字を使用しているため、以上9つのデータベース(フォルダ)すべきではないとchoiceのみsinlge「キー」を扱うことができます。

(私はあなたのprevious questionからいくつかの情報を使用)

関連する問題