0

サーバーから定期的に のデータを取得することを考えています。私はいくつかの調査を行い、どのサーバーがどのディスクで VSS を実行しているかを調べるために、難しいと感じた - または単に正しいコマンドを見つけられなかった.

私が得た締めくくりはこれです:vssadmin list shadowstorageですが、それは私が理解できないpowershellオブジェクトです。'(D:)' のような文字列を検索してその行を取得するために必要な結果が得られます。

ドライブとスペース情報を配列形式で取得したいのですが。

Shadow Copy Storage association
   For volume: (G:)\\?\Volume{68cefbec-f673-467d-95ac-7e442df77cdb}\
   Shadow Copy Storage volume: (G:)\\?\Volume{68cefbec-f673-467d-95ac-7e442df77cdb}\
   Used Shadow Copy Storage space: 2.91 GB (0%)
   Allocated Shadow Copy Storage space: 5.80 GB (0%)
   Maximum Shadow Copy Storage space: 400 GB (19%)

編集:これらのデータを取得したいと思います:

Computername: xxxxxxxsvr01 
Drive (where VSS running on the drive): G:
Allocated Shadows Storage space: 5.80GB
Next run date: which I have no clue how to get it yet

すべて文字列配列になっているので、それで遊ぶことができます。

誰かがこの暗いトピックに光を当てることができれば、私はとても感謝しています.

4

2 に答える 2

0

vssadminPowerShell コマンドレットではなく、コマンドライン ツールです。文字列出力を生成するため、文字列をオブジェクトに変換する場合は、文字列から情報を解析する必要があります。

$pattern = 'for volume: \((.*?)\)[\s\S]*?' +
           'used.*?space: (\d+.*?b)[\s\S]*?' +
           'allocated.*?space: (\d.*?b)'

& vssadmin list shadowstorage | Out-String |
  Select-String $pattern -AllMatches |
  Select-Object -Expand Matches |
  ForEach-Object {
    New-Object -Type PSObject -Property @{
      ComputerName   = $env:COMPUTERNAME
      Drive          = $_.Groups[1].Value
      UsedSpace      = $_.Groups[2].Value
      AllocatedSpace = $_.Groups[3].Value
    }
  }

Win32_ShadowStorageより良い方法は、 WMI クラスを照会することです。次回の実行時間は、それぞれのスケジュールされたタスクから取得できます。

Get-WmiObject -Class Win32_ShadowStorage |
  Select-Object PSComputername, @{n='Drive';e={([wmi]$_.Volume).DriveLetter}},
                AllocatedSpace, UsedSpace,
                @{n='NextRunTime';e={
                  $volume = ([wmi]$_.Volume).DeviceId -replace '[\\?]'
                  (Get-ScheduledTaskInfo "ShadowCopy$volume").NextRunTime
                }}
于 2016-10-13T17:48:19.797 に答える
0

vssadmin は PowerShell オブジェクトを返さず、標準出力にテキストを出力するだけです。得られるのは、テキストの各行が 1 つの項目である配列です。これは、出力を 1 行ずつ処理する場合に便利です。

目的の値を取得するには、テキストを解析する必要があります。

例:

switch -Regex (vssadmin list shadowstorage | ? { $_ -like '   *' }) {

    'For volume: \((.+)\)' { "Volume $($Matches[1])" }

    'Shadow Copy Storage volume:' { }

    'Used Shadow Copy Storage space: ([\d|.]+) GB' { "Used: $($Matches[1]) GB" }

    'Allocated Shadow Copy Storage space: ([\d|.]+) GB' { "Allocated: $($Matches[1]) GB" }

    'Maximum Shadow Copy Storage space: ([\d|.]+) GB' { "Maximum: $($Matches[1]) GB" }

    default { "This line is not recognized yet (add a rule): $_" }
}
于 2016-10-13T16:33:16.193 に答える