我正在寻找 Powershell 中的脚本,其中列出了有关 Windows Server 2016 上的 VSS 卷影复制的信息。我需要检测特定卷上的卷影复制是启用还是禁用。
在 GUI 中(此电脑 > 右键单击 (C:) > 配置卷影副本),您可以禁用或启用每个卷的卷影副本。您可以在附件图像中看到“音量”和“下次运行时间”(“时间”或“禁用”状态)。
我在 powerhsell 中寻找 stript 来列出我可以在 GUI 中看到的信息?
我已经尝试过
vssadmin list volumes
或 Get-CimInstance Win32_ShadowCopy
但我需要检测特定卷上的 VSS 是否已启用或禁用。
请问有人知道这个问题吗?
感谢您的回答和帮助!
我之前编写了一个脚本来执行此操作,我发现我需要使用
vssadmin list shadowstorage
和 Get-ScheduledTask
的组合才能提取我需要的所有信息。
这是我之前想到的(这是一项紧急工作,我再也没有回去过,所以可以做一些整理和一些错误检查,但它应该让你走上正确的道路):
$configuration = vssadmin list shadowstorage
Add-Type -TypeDefinition @'
namespace ScheduledTasks
{
[System.Flags]
public enum DaysOfWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
}
'@
Function Get-Days($flags)
{
$days = @()
if (($flags -band [ScheduledTasks.DaysOfWeek]::Monday) -ne 0)
{
$days += "Monday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Tuesday) -ne 0)
{
$days += "Tuesday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Wednesday) -ne 0)
{
$days += "Wednesday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Thursday) -ne 0)
{
$days += "Thursday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Friday) -ne 0)
{
$days += "Friday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Saturday) -ne 0)
{
$days += "Saturday";
}
if (($flags -band [ScheduledTasks.DaysOfWeek]::Sunday) -ne 0)
{
$days += "Sunday";
}
return $days -join ",";
}
$count = 0;
foreach ($line in $configuration)
{
if ($line.StartsWith("Shadow Copy Storage association"))
{
$DriveLetter = $($configuration[$count + 1]).Trim()
$DriveLetter = $DriveLetter.Substring($DriveLetter.IndexOf('(') + 1, 2)
$VSSDriveLetter = $($configuration[$count + 2]).Trim()
$VSSDriveLetter = $VSSDriveLetter.Substring($VSSDriveLetter.IndexOf('(') + 1, 2)
$UsedSpace = $($configuration[$count + 3]).Trim()
$UsedSpace = $UsedSpace.Substring($UsedSpace.IndexOf(':') + 2)
$AllocatedSpace = $($configuration[$count + 4]).Trim()
$AllocatedSpace = $AllocatedSpace.Substring($AllocatedSpace.IndexOf(':') + 2)
$MaxSpace = $($configuration[$count + 5]).Trim()
$MaxSpace = $MaxSpace.Substring($MaxSpace.IndexOf(':') + 2)
$VolumeID = $($configuration[$count + 1]).Trim()
$VolumeID = $VolumeID.Substring($VolumeID.IndexOf('{'), 38)
$Enabled = $false;
$Triggers = @();
$Task = Get-ScheduledTask -TaskName "ShadowCopyVolume$($VolumeID)" -ea SilentlyContinue
if ($Task -ne $null)
{
$TaskInfo = $Task | Get-ScheduledTaskInfo
$Enabled = $Task.State -ne "Disabled";
foreach ($Trigger in $Task.Triggers)
{
$object = New-Object -typeName PSObject
$object | Add-Member -Type NoteProperty -Name "Start" -Value ([DateTime]::Parse($Trigger.StartBoundary))
$object | Add-Member -Type NoteProperty -Name "End" -Value $(if ($Trigger.EndBoundary) {[DateTime]::Parse($Trigger.EndBoundary) } else { "" })
$object | Add-Member -Type NoteProperty -Name "Days" -Value (Get-Days -flag $Trigger.DaysOfWeek)
$object | Add-Member -Type NoteProperty -Name "WeeksInterval" -Value $Trigger.WeeksInterval
$object | Add-Member -Type NoteProperty -Name "LastRunTime" -Value $TaskInfo.LastRunTime
$object | Add-Member -Type NoteProperty -Name "NextRunTime" -Value $TaskInfo.NextRunTime
$Triggers += $object
}
}
$object = New-Object -TypeName PSObject
$object | Add-Member -Type NoteProperty -Name "Source" -Value $DriveLetter
$object | Add-Member -Type NoteProperty -Name "Destination" -Value $VSSDriveLetter
$object | Add-Member -Type NoteProperty -Name "UsedSpace" -Value $UsedSpace
$object | Add-Member -Type NoteProperty -Name "AllocatedSpace" -Value $AllocatedSpace
$object | Add-Member -Type NoteProperty -Name "MaximumSpace" -Value $MaxSpace
$object | Add-Member -Type NoteProperty -Name "Enabled" -Value $Enabled
$object | Add-Member -Type NoteProperty -Name "Triggers" -Value $Triggers
Write-Output $object
}
$count++;
}
此脚本将以下信息输出为使用
Where-Object
和 Select-Object
等进行过滤的 PSObjects...
我有同样的任务,但系统语言不是英语。 所以我决定使用另一种方法——检查“vssadmin listshadowstorage”命令的响应模板。如果未找到模板,则不会为该驱动器启用卷影存储。 但如果磁盘有 10% 的可用空间,此代码也会启用影子存储。
get-volume | ForEach-Object {
$DriveLetter=$_.DriveLetter
if ($DriveLetter -notlike "") {
$DriveLetter=$DriveLetter+":"
$ShadowStorage=$(vssadmin list shadowstorage /On="$DriveLetter" | Select-String -Pattern '(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})')
if ($ShadowStorage -eq $null){
$AllowSpace=$_.Size
$FreeSpace=$_.SizeRemaining
$SizeForRecovery=10 #percent
$HaveFreeSpace=($AllowSpace/$SizeForRecovery) -lt $FreeSpace
if ($HaveFreeSpace) {
try{
enable-computerrestore -drive $($DriveLetter+"\")
vssadmin Resize ShadowStorage /For=$DriveLetter /On=$DriveLetter /Maxsize=$("$SizeForRecovery"+"%")
}
catch{
Write-Host("Enable shadow storage for drive $DriveLetter - FAILED")
}
finally{
Write-Host("Enable shadow storage for drive $DriveLetter - SUCCESFULLY")
}
}
} else {
Write-Host("For drive $DriveLetter shadow storage is already enabled")
}
}
}