私はコメントバッチファイル、次のタスクのためのお勧め:set variable="value"
とset "variable=value"
との違いを説明するWhy is no string output with 'echo %var%' after using 'set var = text' on command line?上の最初の答えをお読みください
@echo off
setlocal EnableExtensions EnableDelayedExpansion
goto UserPrompt
rem Define environment variable BaseFolder with a double quote character as
rem value in case of the user enters nothing on prompt in which case the
rem variable BaseFolder is still defined with the double quote as value.
rem Then let the user enter the folder path or drag and drop
rem the folder over the console window to enter the path.
rem Next remove all double quotes from folder path and test
rem if the variable BaseFolder still exists with a value.
rem Last replace forward slashes by backslashes in case of user entered
rem the path with forward slashes, make sure the folder path does not
rem end with a backslash and test if the folder really exists in case of
rem user has made a typing mistake on entering manually the folder path.
rem Run the backup and repair operation if entered folder exists as expected.
:UserPrompt
cls
echo/
echo Please type the database base folder path and press ENTER.
echo/
echo Or alternatively drag ^& drop the folder from Windows
echo Explorer on this console window and press ENTER.
echo/
set "BaseFolder=""
set /P "BaseFolder=Path: "
set "BaseFolder=!BaseFolder:"=!"
if "!BaseFolder!" == "" goto UserPrompt
set "BaseFolder=!BaseFolder:/=\!"
if "!BaseFolder:~-1!" == "\" set "BaseFolder=!BaseFolder:~0,-1!"
if "!BaseFolder!" == "" goto UserPrompt
echo/
if not exist "!BaseFolder!\Database\*" (
echo There is no folder "!BaseFolder!\Database".
echo/
choice "Do you want to enter the path once again "
if errorlevel 2 goto ExitBatch
goto UserPrompt
)
set "BackupFolder=%BaseFolder%\Database\RTBackup%DATE:~10,4%_%DATE:~4,2%_%DATE:~7,2%_%TIME:~0,2%%TIME:~3,2%"
rem For German date/time format which is for DATE TIME: dd.mm.yyy hh:mm:ss,xx
rem set "BackupFolder=%BaseFolder%\Database\RTBackup%DATE:~-4%_%DATE:~-7,2%_%DATE:~-10,2%_%TIME:~0,2%%TIME:~3,2%"
if exist "%BackupFolder%\*" goto MakeBackup
md "%BackupFolder%"
if errorlevel 1 (
echo/
echo Error: Failed to create backup folder !BackupFolder!
echo/
choice "Repair without making a backup "
if errorlevel 2 goto ExitBatch
goto RunRepair
)
:MakeBackup
echo Making a backup to folder !BackupFolder! ...
move /-y "%BaseFolder%\Database\*.dbf" "%BackupFolder%" 2>nul
move /-y "%BaseFolder%\Database\*.cdx" "%BackupFolder%" 2>nul
move /-y "%BaseFolder%\Database\*.~cd" "%BackupFolder%" 2>nul
move /-y "%BaseFolder%\Database\*.~db" "%BackupFolder%" 2>nul
move /-y "%BaseFolder%\Database\*.fpt" "%BackupFolder%" 2>nul
move /-y "%BackupFolder%\zipdata.dbf" "%BaseFolder%\Database\" 2>nul
:RunRepair
echo/
echo Running database repair ...
"%BaseFolder%\dbrepair.exe"
:ExitBatch
endlocal
。
環境変数Datefolder
が二重引用符で、問題のバッチファイルで作成されたが、もちろん良くない
"C:\UTS16\Database\RTBackup"2017_01_13_1250""
に例えば
"%letter%:\UTS16\Database\RTBackup%Datefolder%"
の拡大をもたらし、環境変数の値に含まれています。二重引用符で囲まれた文字列の中の二重引用符は、一般に正しくありません。
とコマンドライン
mkdir %letter%:\UTS16\Database\"RTBackup%Datefolder%"
は、Windowsのエラー訂正は、フォルダパスを修正するために残業をしなければならない
mkdir C:\UTS16\Database\"RTBackup"2017_01_13_1250""
に例えば拡大しました。
環境変数DATE
およびTIME
の日付/時刻形式は、現在のユーザーのWindows地域および言語設定によって異なります。ドイツのWindowsマシンの名前に日付と時刻のバックアップフォルダを定義するために別の行が必要でした。たとえば、How to get current datetime on Windows command line, in a suitable format for using in a filename?に掲載されている地域に依存しないソリューションがあります。ただし、環境変数DATE
とTIME
を使用するより高速のコマンドラインが、このバッチファイルが使用されているコンピュータで動作する場合、そのラインを地域に依存しないソリューションに置き換える必要はありません。
この回答のバッチファイルは、誤って構文ミスで遅延拡張を使用しないパス文字列を入力した場合のバッチ処理の終了を防ぐため、環境変数の遅延拡張を主に使用します。
ユーザーは&をドラッグして、たとえばWindowsエクスプローラからコンソールウィンドウにドロップして、プロンプトでフォルダパスを入力することもできます。 DosTipsフォーラムのトピックによって説明されるように
echo/
はアンパサンド&
は引用符で囲まずに1つのコマンドラインで複数のコマンドを実行するためのオペレータとしてWindowsコマンドインタープリタによって解釈さECHO. FAILS to give text or blank line - Instead use ECHO/
出力にecho.
よりも優れている空白行を使用されています文字列。そのため、この文字をキャレット文字^
でエスケープして、コンソールウィンドウにエコーするリテラル文字として解釈する必要があります。コマンドラインに引用符で囲まれていない文字列で^
でエスケープされていない、&
,&&
およびの意味の詳細については、Single line with multiple commands using Windows batch fileを参照してください。
コマンドchoice
は、ユーザーがエラーを続行するか、バッチファイルを終了するかを尋ねるときに使用されます。このコマンドを入力すると、はいまたはいいえ、Windowsの場合は[Y,N]?
、ドイツ語の場合は[J,N]?
のようにクエスチョンマークが付加されます。 choiceは、終了する前に他のキーを許可しません。 errorlevel
に割り当てられた終了コードはで2
であり、と1
でありです。
は、以前のコマンドまたはアプリケーションの終了コードでテストするためのif errorlevel
の使用方法について説明しています。この場合、ユーザがNoを選択した場合のエラーに対してバッチ処理を終了するには、errorlevel
が2以上であることをテストすれば十分です。
"%BaseFolder%\dbrepair.exe"
が実際に存在するかどうかは、このアプリケーションの実行を試みる前にチェックされません。バックアップフォルダを作成する前に、ユーザーに適切なエラーメッセージが表示されている追加のチェックが追加されているとよいでしょう。
使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。
choice /?
cls /?
echo /?
endlocal /?
goto /?
if /?
md /?
move /?
set /?
setlocal /?
も2>nul
の説明については、Microsoft TechNetの記事Using command redirection operatorsをお読みください。
ドライブレターで使用したのと同じコードです。 – Squashman
これで、ドライブレターのコードと同じコードを使用して、フォルダの年を決定することができました。そのチップをありがとう。申し訳ありませんが、私はこれで本当に新しいですし、私はそれを即座に把握しようとしています。今は "%Datefolder%"を取得して、作成するRTBackupフォルダの最後に日付と時刻を表示することはできません。私はそれが作成された日時を表示したいだけです。 –
このコマンドラインは主にバッチファイルから選択します: 'echo%date:〜10,4%_%date:〜4,2%_%date:〜7,2%_%time:〜0.2 %% time:〜3,2% 'とし、Ctrl + Cでクリップボードにコピーします。コマンドプロンプトウィンドウを開き、コンソールウィンドウを右クリックしてコピーした行を貼り付け、コンテキストメニューで__Paste__を左クリックし、ENTERキーまたはRETURNキーを押してこのコマンドを実行します。あなたが期待する出力ではなく、 'echo%DATE %% TIME%'コマンドを実行し、出力日時を調べます。 – Mofi