0

私は初心者で、質問を正しくしていない場合はお詫びしますが、リストをループして、そのリスト内の特定のトークンに変数を割り当ててから、変数をコマンドに渡したいと思います (変数ごとに両方の変数を使用します 1? ?? 適切に質問しているかどうかわかりません。

WK1List1 には次のようなものがあります。

servername ipaddress
anotherservername anotheripaddress

-- バッチ セグメントは --

::format date in yyyy-mm-dd to apply to a directory, use is
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set today=%%c-%%a-%%b)

set homedir=E:\backups
set backuplog=E:\backups\LOGS\wk1-errors.log
set WK1List1=E:\backups\Lists\Week1_VMList_1.txt


SETLOCAL EnableDelayedExpansion
SET count=1
FOR /F "tokens=1 delims= usebackq" %%a IN ("%WK1List1%") DO (
SET var!count!=%%a
SET /a count=!count!+1

SET count=1
FOR /F "tokens=2 delims= usebackq" %%b IN ("%WK1List1%") DO (
SET var!count!=%%b
SET /a count=!count!+1
call :runbkup
)

:runbkup
echo "%%a backup started on %DATE% at %TIME%" >%backuplog% 2<&1
if exist %homedir%\%%a Rename %homedir%\%%a%_temp
start "%%a" cmd /c vcbmounter.exe -h vc2.domain.local -u domain\uid -p pwd -m `nbd -a ipaddr:%%b -r %homedir%\%%a -t fullvm -M 1
if exist "%homedir%\%%a" RD "%homedir%\%%a%_temp" /Q /S
echo "%%a backup completed on %DATE% at %TIME%" >>%backuplog% 2<&1
if exist "%homedir%\%%a_temp" echo "%%a was not successful on %DATE%-pls investigate" >>%backuplog% 2<&1

ENDLOCAL
4

1 に答える 1

0

悲しいことに、バッチの検閲が厳しすぎたようです。現状では、ほとんど意味がありませんが、ここでは...

まず、慎重にセットアップします todayが、使用しないでください。

次に、サーバー名としてvar1..を設定したいようです。varnわかりました - ただし、カウントを更新した後、DOブロックを終了する必要があります - そのため、閉じ括弧を省略しました。

次に、省略された括弧を入れると、アクションが繰り返され、非常に同じ配列が..にipaddressesに設定されます。var1varn

とにかく、あなたはvar配列を使用していません! 残りのバッチには表示されません。

var11 行目の ipaddressを設定したらCALL、バックアップ ルーチン%%aを実行し%%bます。%a%b

ループが終了すると、バッチはDelphiや Pascal のように終了しません。ラベルを介して充電するだけです:runbkup...FOR...%%b

:runbkup-に向けて

echo ステートメントのポイントはありません2<&1。リダイレクターはとにかく間違った方向にあるようです。

これにより、ログファイルが再起動されます-元のファイルを削除し、ed テキストを新しいものに送信>%backlog%ますECHO

renameコマンドには宛先名がありません。

では、この列車事故にどのように対処すればよいでしょうか。

まあ、バッチなので簡単です。

@echo off
::format date in yyyy-mm-dd to apply to a directory, use is
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set today=%%c-%%a-%%b)
setlocal enabledelayedexpansion
set homedir=E:\backups
set backuplog=E:\backups\LOGS\wk1-errors.log
set WK1List1=E:\backups\Lists\Week1_VMList_1.txt

SET count=1
FOR /F "usebackq tokens=1,2 delims= " %%a IN ("%WK1List1%") DO (
SET var!count!=%%a
SET anothervar!count!=%%b
SET /a count=!count!+1
call :runbkup %%a %%b
)

GOTO :EOF

:runbkup
echo "%1 backup started on %DATE% at %TIME%" >>%backuplog%
if exist %homedir%\%1 Rename %homedir%\%1 %1_temp
start "%1" cmd /c vcbmounter.exe -h vc2.domain.local -u domain\uid -p pwd -m `nbd -a ipaddr:%2 -r %homedir%\%1 -t fullvm -M 1
if exist "%homedir%\%1" RD "%homedir%\%1_temp" /Q /S
echo "%1 backup completed on %DATE% at %TIME%" >>%backuplog%
if exist "%homedir%\%1_temp" echo "%1 was not successful on %DATE%-pls investigate" >>%backuplog%
GOTO :eof

[私はこれを試していませんが、うまくいくはずです]

このバージョンはtokens=1,2、ファイルから読み取った行の最初と 2 番目のトークンを選択するために使用します。タイプミスの場合に区切り文字として使用する一連の文字をusebackq与えないように、最初に配置することを個人的に好みます。delimsデフォルトの区切り文字は、スペース、タブ、カンマ、セミコロンです。したがって、delims句は不要ですが、害はありません。

varとのanothervar配列は、サーバー名と ipaddresses に設定されます (それらを使用しない場合でも)。

:runbkupは 2 つのパラメーターで呼び出されます。サブルーチンに関する限り、これらは表示されるため、ルーチン%1はおよびによって置き換えられます。%2%%a%1%%b%2

それを超えて、あなたが持っていたように-を省略し、ログに2<&1( ) を追加し、明らかに意図した宛先名を付けます。>>rename

この行に注目していただきたいと思いますVCBMOUNTER- 私はそのアプリケーションの経験がありませんが、オリジナルのシーケンス "-m `nbd" は私を困惑させます。非常に珍しいです。

HTH

于 2013-06-12T17:09:24.647 に答える