ユーザー間の一時的な転送に使用するユーザー フォルダーがいっぱい入ったフォルダー (Users) があります。ユーザー フォルダーを削除したり権限を変更したりせずに、ユーザー フォルダーの内容を空にするスクリプトをスケジュールできるようにしたいと考えています。
これをバッチファイルで実行する方法はありますか? 最初は次のようなものが使えると思いました:
del /F \Users**.*
しかし、それはうまくいきませんでした。
助けてください!
そしてありがとうございました!!
答え1
Server 2012 を使用している場合、バッチを使用する理由はほとんどありません。
ここで、Powershell をいくつか紹介します。
Foreach($_ In Get-ChildItem C:\Users -Recurse)
{
If(!$_.PSIsContainer) { Remove-Item $_.Fullname }
}
これにより、C:\Users ディレクトリ ツリー内およびその下にあるすべてのファイルが削除されますが、すべてのディレクトリはそのまま残ります。
編集:
これはどう:
Foreach($_ In Get-ChildItem C:\Users)
{
If($_.PSIsContainer)
{
Get-ChildItem $_.FullName -Recurse | Remove-Item
}
}
そこで、今やっていることは、C:\Users の下の「第 1 レベル」ディレクトリのリストを取得し、それらの各フォルダの内容を再帰的に消去することです。そのため、最終的に残るのは C:\Users とその下の第 1 レベルのサブディレクトリだけです。
編集:これをもっとよく理解したいが、Powershell は初めてだとおっしゃっていたので、上記のスクリプトをもう少し詳しく説明します。
Get-ChildItem C:\Users
基本的にはDOSと同じですC:\> dir C:\Users
が、Powershellはすべてを次の形式で処理して返します。オブジェクト単純なコンソール出力ではありません。最初の行を読むと
Foreach($_ In Get-ChildItem C:\Users)
これは、C:\Usersに存在する各「オブジェクト」に対してループを実行することを意味します。ないここでパラメータを使用すると-Recurse
、Powershell は C:\Users の第 1 レベルのディレクトリ リストのみを返し、サブディレクトリまでは掘り下げません。
If($_.PSIsContainer)
これは、現在のオブジェクトの「PSIsContainer」プロパティが True に設定されている場合 (つまり、「これがディレクトリである場合」という意味の言い換え)、この if ループに入ることを意味する If ステートメントです。
したがって、 の下にあるすべてのサブディレクトリに対してC:\Users
、If ループに入ります。 の下に 、、 という3C:\Users
つのサブディレクトリがあるとします。これらのサブディレクトリの下には、任意の数のファイルとサブディレクトリが存在するC:\Users\joe
可能性があります。C:\Users\kate
C:\Users\bill
したがって、If ループに 3 回入るので、各回は次のようになります。
Get-ChildItem <C:\Users\joe> -Recurse | Remove-Item
Get-ChildItem <C:\Users\kate> -Recurse | Remove-Item
Get-ChildItem <C:\Users\bill> -Recurse | Remove-Item
この行は、そのサブディレクトリの内容を取得し、、、および-Recurse
のすべてのサブディレクトリをドリルダウンするようにスイッチが指定されていますjoe
。kate
bill
そして、それらの子オブジェクトをすべて取得し、パイプを にコピーし、を の別名としてRemove-Item
考えることができます。 は、 をすべて削除します。Remove-Item
del
意味をなす?