Проблема с функциями Powershell в.ps1
Я пытаюсь изменить рабочий скрипт, сделать его модульным. Сценарий предназначен для подключения к серверу DPM, получения подключенных библиотек и инвентаризации их. После завершения инвентаризации сценарий помечает соответствующие ленты как "свободные". Сценарий ниже
У меня две проблемы. Первый пришел и ушел, как я редактировал сценарий. Когда я запускаю скрипт: .\ Script.ps1, Powershell говорит:
C: \ it \ test.ps1: не удалось проверить аргумент для параметра 'DPMLibrary'. Аргумент нулевой. Укажите ненулевой аргумент и повторите команду.
В строке:1 символ:11 + .\ Test.ps1 <<<<
- CategoryInfo: NotSpecified: (:) [Write-Error], WriteErrorException FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException, test.ps1
Вторая проблема возникает, когда я только что скопировал функции в оболочку. Функция Get-Libraries работает нормально и возвращает свойства подключенной библиотеки. Когда я передаю параметр Inventory-DPMLibrary, инвентаризация завершается. Когда я передаю параметр библиотеки в функцию Update-TapeStatus, я получаю сообщение об ошибке
Неверный аргумент для оператора '-notmatch': синтаксический анализ "slot" - Quantifier {x, y} follo wing ничего не..
В строке:6 символов: 77
- $ tapes = Get-DPMTape -DPMLibrary $ lib | Где {$_.Location -notmatch <<<< " *slot *"} | Сортировать местоположение
- CategoryInfo: InvalidOperation: (:) [], RuntimeException? + FullyQualifiedErrorId: BadOperatorArgument
Похоже, что параметр $ liblist имеет значение null, хотя переменная - нет. Что дает?
Вот сценарий:
[CmdletBinding()]
param(
[ValidateSet("Fast","Full")]
[string]$InventoryType = 'Fast',
[string]$DPMServerName = 'server1'
)
Function Import-DPMModule {
Try {
Import-Module DataProtectionManager -ErrorAction Stop
}
Catch [System.IO.FileNotFoundException] {
Throw ("The DPM Powershell module is not installed or is not importable. The specific error message is: {0}" -f $_.Exception.Message)
}
Catch {
Throw ("Unknown error importing DPM powershell module. The specific error message is: {0}" -f $_.Exception.Message)
}
}
Function Get-Libraries {
Write-Verbose ("Getting list of libraries connected to {0}." -f $DPMServerName)
Try {
$libraries = Get-DPMLibrary $DPMServerName -ErrorAction Stop | Where {$_.IsOffline -eq $False}
}
Catch [Microsoft.Internal.EnterpriseStorage.Dls.Utils.DlsException] {
Write-Error ("Cannot connect to the DPM library. It appears that the servername is not valid. The specific error message is: {0}" -f $_.Exception.Message)
Return
}
Catch {
Write-Error ("Unknown error getting library. The specific error message is: {0}" -f $_.Exception.Message)
Return
}
Return $libraries
}
Function Inventory-DPMLibraries ($liblist) {
Foreach ($lib in $liblist) {
If ($InventoryType -eq "Fast") {
Write-Verbose ("Starting fast inventory on {0}" -f $lib)
$inventoryStatus = Start-DPMLibraryInventory -DPMLibrary $lib -FastInventory -ErrorAction SilentlyContinue
}
Else {
Write-Verbose ("Starting detailed inventory on {0}" -f $lib)
$inventoryStatus = Start-DPMLibraryInventory -DPMLibrary $lib -DetailedInventory -ErrorAction SilentlyContinue
}
While ($inventoryStatus.HasCompleted -eq $False) {
Write-Output ("Running {0} inventory on library: {1}" -f $InventoryType.ToLower(),$lib.UserFriendlyName)
Start-Sleep 5
}
If ($inventoryStatus.Status -ne "Succeeded") {
Throw ("Unknown error in inventory process. The specific error message is: {0}" -f $_.Exception.Message)
Return
}
}
}
Function Update-TapeStatus ($liblist) {
Foreach ($lib in $liblist) {
write-host ("in tapestatus. the lib is: {0}" -f $lib)
Write-Verbose ("Beginning the process to determine which tapes to mark 'free' on {0}" -f $lib)
Write-Verbose ("Getting list of tapes in {0}." -f $lib)
$tapes = Get-DPMTape -DPMLibrary $lib | Where {$_.Location -notmatch "*slot*"} | Sort Location
Foreach ($tape in $tapes) {
If ($tape.DisplayString -eq "Suspect") {
Write-Verbose ("Remove suspect tapes from the DPM database.")
Invoke-Command -ScriptBlock {osql -E -S server2 -d DPMDB_server1 -Q "UPDATE tbl_MM_ArchiveMedia SET IsSuspect = 0"} -whatif
Start-DPMLibraryInventory -DPMLibrary $lib -FastInventory -Tape $tape -whatif
}
#Run a full inventory on "unknown" tapes
#Make recyclable tapes "free"
If (($tape.DisplayString -notlike "Free*" -and $tape.DataSetState -eq "Recyclable") -or ($tape.DisplayString -like "Unrecognized")) {
Write-Output ("Marking the tape in slot {0} as free." -f $tape.Location)
Set-DPMTape $tape -Free -whatif
}
If ($tape.OMIDState -eq "Unknown") {
Write-Warning ("Unknown tape found in slot {0}. Beginning detailed inventory." -f $tape.location)
$inventoryStatus = Start-DPMLibraryInventory -DPMLibrary $lib -DetailedInventory -Tape $tape -whatif
While ($inventoryStatus.HasCompleted -eq $False) {Write-Output ("Running full inventory on the tape in slot {0} (label {1})" -f $tape.Location,$tape.Label); Start-Sleep 10}
}
}
}
}
#Calling functions
Try {
Import-DPMModule
}
Catch {
Write-Error $_
Exit
}
Try {
$liblist = Get-Libraries
}
Catch {
Write-Error $_
Exit
}
Try {
Inventory-DPMLibraries
}
Catch {
Write-Error $_
Exit
}
Update-TapeStatus $liblist
Благодарю.
1 ответ
Ваша функция Inventory-DPMLibraries
ожидает параметр ($liblist
):
Function Inventory-DPMLibraries ($liblist) {
...
}
Однако вы не предоставляете этот параметр при вызове функции:
Try {
Inventory-DPMLibraries
}
Catch {
Write-Error $_
Exit
}
Измените вышеупомянутое в это:
Try {
Inventory-DPMLibraries $liblist
}
Catch {
Write-Error $_
Exit
}