2

フォルダー内に a1.txt、a6.txt、a8.txt などの名前のファイルがたくさんあり、それらをカウントする必要があります。このバッチ ファイルを試しましたが、* をアカウントの方法として認識しませんはすべての数に対して有効であり、正しい答えは返されません。

set /a count=0
for /F "tokens=* delims= " %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a.*"') do (set /a count=count+1) 

私が間違っていることがわかりますか?事前にご協力いただきありがとうございます。

4

6 に答える 6

2

これを1行で行うことができます

dir /a-d "C:\Users\xyz\desktop\Project\a.*" | find /C "/"
于 2013-10-20T02:00:29.097 に答える
2

あなたが間違っているのは、a で始まるすべてのファイルのワイルドカードです。

あなたは使用dir a.*していて、それが次のようなファイルを見つけることを期待していますa6.txt

また、スペースを含むファイル名を処理するには、区切り記号を削除することをお勧めします。

set /a count=0
for /F "delims=" %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*"') do (set /a count=count+1)

(コードをより効率的にするという観点から、他の回答にも耳を傾けてください。)

于 2012-08-13T00:43:07.703 に答える
1

同様の問題に直面したとき、私は Raymond Chen から学んだトリックを使用することを好みfindますwc -l

したがって、次のスクリプトは、バッチ変数countを一致するファイルの数に設定しますpatttern。元のスクリプトと同様に、ディレクトリはカウントから除外されます。

@echo off

setlocal

set count=0
set pattern=a?.txt

use dir /b %pattern% ^| find /c /v ""

for /f %%i in ('dir /b /a-d %pattern_you_are_looking_for% ^| find /c /v ""') do @call set count=%%i

echo %count%

endlocal
于 2012-08-13T00:25:42.570 に答える
1

アスタリスクの位置が間違っています。私はあなたが意図したと思いますa*.txt。ただし、これは名前が「a」で始まるテキスト ファイルと一致します。結果は、"a" で始まり、その後に数字が続くテキスト ファイルに限定されません。

DIR コマンドの結果を FINDSTR にパイプし、正規表現を使用してより具体的にすることができます。FINDSTR 正規表現のサポートは原始的ですが、多くの場合、これでうまくいきます。

「a1.txt」や「a143.txt」などの名前は一致させたいが、「a1b.txt」や「aba1.txt」などのファイルは一致させたくないと仮定します。私が間違っている場合は、要件に合わせて正規表現を変更する必要があります。

この正規表現\\a[0-9][0-9]*\.txt$は次のように機能します。

  • \\エスケープされたバックスラッシュで、ファイル名の前の最後のバックスラッシュに一致します
  • aもちろんそれ自体に一致します
  • [0-9]1 桁の数字に一致します (少なくとも 1 桁ある必要があります)
  • [0-9]*0 個以上の追加の数字に一致
  • \.txt$ドットをエスケープし、「.txt」拡張子に一致します。$ は文字列の末尾に一致します。追加の文字が続くと一致しません。

最後に、FINDSTR の結果を FIND にパイプして、ファイル数をカウントできるようにします。FIND /C /V ""は任意の行に一致し、/C オプションは一致する行の数を示します。ループ内でカウンターをインクリメントするよりも効率的です。

@echo off
setlocal
set /a count=0
for /F %%N in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*.txt"^|findstr /ric:"\\a[0-9][0-9]*\.txt$"^|find /c /v ""') do set count=%%N
echo count=%count%
于 2012-08-13T00:44:56.253 に答える
0

これは、数えるちょっとこっそりした方法です。

for /f "tokens=1 usebackq" %a in (`dir a* ^| find ^"File^(s^)^"`) do set count=%a

これはコマンド ラインから実行できます - バッチ ファイルの場合は double % に変更します

^コマンド ラインに渡される代わりに、次の文字がバッチ ファイルの一部として解釈されるのを防ぐために、多くのエスケープ (を使用) があります。

実行中のコマンドは ですdir a* | find "File(s)"|(、 、)"特別な意味を持つ傾向があります

于 2012-08-13T15:41:13.077 に答える