2

次のロジックを使用して、フォルダー内のすべてのフォルダーを一覧表示する必要があるスクリプトを作成しようとしています。

フォルダー A、B、C がフォルダー F 内にあり、A、B、C にサブフォルダーとファイルが含まれているとします。

フォルダー A、B、C をヘッダーとして表示し、指定されたサイズを超えるファイル (サブフォルダーを含む) をリストするスクリプトを作成する必要があります...可能であれば、変更日と共に。

骸骨を用意しました。

@echo off & setLocal EnableDelayedExpansion pushd C:\F

for /f "tokens=* delims= " %%a in ('dir/b/a:d') do (

echo %%a >>C:\F\list.txt
echo "-----------------------------------------------">>C:\F\list.txt
pushd %%a 
for /f "tokens=* delims= " %%i in ('dir/b/s') do (
    echo %%i >>C:\F\list.txt
    if %%~Za gtr 10000 echo %%i is %%~Za >>C:\F\list.txt
    ))

目的の出力は次のとおりです。

ディレクトリ A

ファイル1 サイズ1 日付1

ファイル2 サイズ2 日付2

ディレクトリ B

ファイル3 サイズ3 日付3

ファイル4 サイズ4 日付4

ディレクトリ C

ファイル5 サイズ5 日付5

ファイル6 サイズ6 日付6

---date フィールドは必須ではありませんが、含めたほうがよいでしょう。

ありがとうございます。それでは、お元気で

4

2 に答える 2

1

コードの一般的な考え方は次のとおりです。基本的に、各ディレクトリとサブディレクトリを検索し、指定されたタイプのすべてのファイルを見つけます。次に、プログラムはそれぞれの一意のファイル ディレクトリを検索し、指定したサイズよりも大きいファイルを検索して、要求した形式で出力します。注: トラブルシューティングの目的で、コードには多くの「追加」が含まれています。不要なテキスト ファイルは自由に削除してください。=]

@echo off & setLocal EnableDelayedExpansion pushd C:\F

::sets size limit
SET sizelimit=10000

::searches for all files in directories and subdirectories and outputs to files.txt
dir /b/s >> files.txt

::finds all .zip files in files.txt
type files.txt | findstr /E .zip > myfile1.txt

::finds all .zip file locations and unique file locations
FOR /F "tokens=* delims=\" %%a in (myfile1.txt) do @echo %%~dpa >>filelocations.txt
FOR /F "delims==" %%L in (filelocations.txt) do find "%%L" unique.txt>nul || echo %%L>>unique.txt

::Loops through each unique location, finds all the .zip files and checks if they are larger
:: than the specified file size, then outputs the results to output.txt
FOR /F "tokens=* delims= " %%a in (unique.txt) do (
echo %%a >>output.txt
findstr "%%a" myfile1.txt >temp.txt
FOR /F "tokens=* delims=" %%a in (temp.txt) do (
if %%~za gtr %sizelimit% echo %%~nxa %%~za %%~ta >>output.txt
)
)

end local

::Cleans up extra files (which are generated for troubleshooting purposes)
del files.txt myfile1.txt filelocations.txt unique.txt temp.txt
于 2012-09-25T18:02:42.933 に答える
0

ここにあなたの質問に答えて。

ええと、出力をにパイプすることもできますがsort、それには少なくとも3つの問題があります。

最初の問題は、最後までタックすると、一度に1行しかソートされないことです。つまり、まったくソートされません。forこれを修正するには、コマンド全体をブロック内に配置して()から、ブロックの出力をにパイプすることができますsort。これにより、他の問題が発生しますが、これらの問題は解決できると確信しています。

それに関する2番目の問題は、月から始まるアルファベット順に日付を並べ替えることです。つまり、すべての1月1/dd/yyyyが最初に来て、次にすべての10月が来る10/dd/yyyyということです。つまり、すべての年が混ざり合い、1月、10月、11月、12月、2月、3月などに並べ替えられます。

sortのコマンドを使用してサイズで並べ替えることができますが、意味が後に来る/+colことを比較します。(並べ替えの詳細については、入力してください。)size[tab]filename2[tab]hello1000[tab]hellosort /?ENTER

私がお勧めするのは、useusedirの機能を次のように並べ替えることです。

:: Sort by name
FOR /F "tokens=* delims= " %%a in ('dir /b /o:n ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by size
FOR /F "tokens=* delims= " %%a in ('dir /b /o:s ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by date
FOR /F "tokens=* delims= " %%a in ('dir /b /o:d ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

/o:orderコマンドには他のオプションがあります。dir /?ENTER動作の詳細については、コマンドプロンプトで入力してくださいdir

于 2012-10-01T18:53:30.083 に答える