3

私の質問は、いくつかのフォルダーとサブフォルダーをバッチ ファイルで自動的にバックアップするために書いているスクリプトに関するものです。
現在、何らかの進行状況インジケーターを読み取り可能な形式で、できればパーセントで実装しようとしています。
まず、次のコマンドでコピーする合計サイズを読み取ります。

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
set /a overall=!overall!+%%~zF
)

テスト バッチの特定のフォルダーの場合、これは 266,173,879 バイトのサイズを返します。
ただし、この数値を for ループの後で、たとえば 1024 (キロバイトの場合) で除算しようとすると、

set /a overall=%overall%/1024

バッチは、「/1024 はここでは構文的に使用できません」という行に沿って何かを返します (おそらく正しい翻訳を知っているでしょう。私の翻訳はドイツ語です)。
括弧とスペースを追加/削除しようとしましたが、同じエラーが発生し続けます。

目隠しをして見えない私の構文に何か問題がありますか?
そうでない場合、C++ 変数に割り当てられる %overall% の値を提供する C++ .exe をどのように呼び出しますか? (C++ は、私が最小限から基本的な知識しか持っていない唯一の他のプログラミング言語です。PowerShell はオプションではなく、通常の Windows Batch でなければなりません)

関連する完全なコード:

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
set /a overall=!overall!+%%~zF
)

set /a overall=%overall%/1024

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
xcopy "%%F" "E:%%~pF" %parameter%>nul
cls
echo Copying... Progress: !size! of !overall! KB copied.
)
4

3 に答える 3

2

ここでは、バッチ ファイルとその計算上の制限に関するいくつかの良い情報を示します。このページには、これらの制限に対処する最善の方法に関する情報も含まれています。

バッチ演算には重大な制限があります: 32 ビット整数しか処理できません。 http://www.robvanderwoude.com/battech_math.php

これは、符号なしの場合は4,294,967,295、符号付きの場合は-2,147,483,6482,147,483,647 です


簡単にするために、robocopyWindows 2003/XP 以降を使用している場合は、使用を検討することをお勧めします。robocopy ツールを追加するには、 Windows リソース パック(XP で動作) をインストールする必要があることに注意してください。すべての機能とログ オプションについては、robocopy リンクを参照してください。

于 2013-01-02T17:04:39.480 に答える
0

このエラーは、式に構文エラーがあることを示しています。デバイスにしようとしている数値は 2 億 6000 万です。これは、バッチが処理できる最大精度の 32 ビット数値に安全に収まっています。

266,173,879問題は、カンマを含めて値が実際には であるということだと思います。ローカリゼーションの設定によっては、師団がそれらの文字をフェイルオーバーする場合があります。

を試してみると266,173,879/1024、常に が返されますが0、これは良くありません。試してみると266.173.879/1024、「演算子がありません」と表示されますが、これも正しくありません。

もう 1 つの可能性は%overall%、最初は値を取得していないことです。それは式を次のようにします

set /a overall=/1024

もちろん、これは無効であり、上記missing operandとは少し異なるエラーを返します。missing operator

最も安全な方法は、最初に %overall% に値があることを確認し、次に文字列からコンマを削除することです。

その後、動作するはずです:

C:\>set /a overall=266173879/1024
259935

ディレクトリが 2 GB を超えると問題が発生することに注意してください。

于 2013-01-02T17:15:40.980 に答える
0

バッチが数値をどのように処理するかはわかりませんが、必要な数値intlongなどを使用できるため、C++ を使用する方が良いと思います。

を使用して数値を C++ アプリに渡すことができます。

yourcpp.exe !overall! 1024

の引数を使用してそれらをピックアップし、それらmainを分割します (私の C++ は優れていませんが、このようなものにする必要があります)。

int main(int argc, char* argv[]) {
double n = (double)argv[0]/(double)argv[1];
return 0;
}

次に、バッチファイルを使用して読み取ることができるテキストファイルに出力するなど、必要に応じて保存できます。

于 2013-01-02T14:14:28.793 に答える