0

私は Powershell を初めて使用することから始めますが、私が聞いたところによると、Powershell は非常に強力である可能性があります。

そうは言っても、問題を特定します。

毎日実行する予定の Powershell スクリプトを作成し、いくつかの特定のフォルダーの合計サイズを確認しようとしています。これらの各フォルダー内には、名前で並べ替えられたフォルダーがあります。最終結果として私が目指しているのは、これらのフォルダーのサイズをチェックするスクリプトであり、事前に設定した定義された制限を超えた場合、それらのコンテンツは事前定義された宛先に移動されます。ファイルは、以前に配置されていたのと同じ名前のフォルダーに移動されます。

ここに私がこれまでに得た場所があります:

$Folder_A = "C:\Users\location_A"
$Folder_B = "C:\Users\location_B"
$Folder_C = "C:\Users\location_C"
if((get-childitem $Folder_A , $Folder_B , $Folder_C | where {$_.name -eq name_1-or $_.name -eq $Name_2} | measure-object -property length -sum).sum -gt 30000) {write-host "success"}

出力?

You must provide a value expression on the right-hand side of the '-eq' operator.
At line:1 char:63
+ if((get-childitem $input , $Temp , $Tiffs | where {$_.name -eq <<<<  I001 -or $_.name -eq I002} | measure-object -property length -sum).sum -gt 30000) {
write-host "success"}
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedValueExpression

誰かがこのことの進歩を助けることができれば、私はそれを大いに感謝します!

前もって感謝します。

4

3 に答える 3

0

プロパティが多数の参照のいずれかに一致するかどうかを確認する標準的な方法は、参照文字列を配列に入れ、配列にプロパティ値が含まれているかどうかを確認することです。チェックするフォルダーの名前も、単一の変数ではなく配列にする必要があります。

次のようなことを試してください:

$src = @(
  "C:\Users\location_A",
  "C:\Users\location_B",
  "C:\Users\location_C"
)

$ref = @(
  "name_1",
  "name_2",
  ...
)

$found = [bool](Get-ChildItem $src `
  | ? { $ref -contains $_.Name } `
  | Measure-Object -property Length -sum `
  | ? { $_.sum -gt 30000 })

if ($found) { write-host "success" }
于 2013-04-14T13:17:11.797 に答える
0

where クロージャにスペースがありません。そのはず:

where {$_.name -eq name_1 -or $_.name -eq $Name_2}

それが正しく機能していることを確認するには、() を使用して、ステートメントを次のようにします。

 where {($_.name -eq name_1) -or ($_.name -eq $Name_2)}

UPDATE 選択したディレクトリの合計を計算するための私の完全な(テスト済みの)スクリプト:

$names = @("IIS", "IIS Express")
$folders = @("C:\Program Files", "C:\Program Files (x86)")
$x = (gci $folders | where {$names -contains $_.name})
$sum = (($x | %{(Get-ChildItem $_.FullName -recurse | Measure-Object -property length -sum)}) | Measure-Object -Property 'Sum' -Sum).sum
if($sum -gt 3000){write-host "success"}

あなたの場合:必要なものを入れて名前に$folders = @("C:\Program Files", "C:\Program Files (x86)")置き換えます$folders = @("C:\Users\location_A", "C:\Users\location_B", "C:\Users\location_C")

于 2013-04-14T12:20:41.803 に答える
0

パスにはディレクトリの配列を使用できます。-Recurse を使用する場合 (再帰するサブディレクトリがない場合でも)、ファイル名のリストを配列引数として -Include パラメーターに指定できます。

$Folders = 'C:\Users\location_A','C:\Users\location_B','C:\Users\location_C'
$Files = 'name_1','name_2'

if ((((get-childitem $Folders -Recurse -Include $files | select -ExpandProperty length) | measure -sum).sum) -gt 30000)
  {write-host 'Success'}
于 2013-04-14T16:02:38.530 に答える