2013-11-18 4 views
0

Я пытаюсь изменить рабочий скрипт, чтобы сделать его модульным. Цель скрипта - подключиться к серверу DPM, получить вложенные библиотеки и инвентаризировать их. После того, как инвентарь будет выполнен, сценарий помещает соответствующие ленты как «свободные». Сценарий нижеПроблема с функциями Powershell в .ps1

У меня есть две проблемы. Первый пришел и ушел, поскольку я редактировал сценарий. Когда я запускаю сценарий:. \ 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, я получаю сообщение об ошибке:

Bad аргумент оператор «-notmatch»: разбор «слота» - квантор {х, у} FOLLO крыла ничего ..

В строке: 6 символ: 77

  • $ ленты = Get-DPMTape -DPMLibrary $ LIB | Где {$ _. Местонахождение -notmatch < < < < "* slot *"} | Сортировка Location
    • Категория: InvalidOperation: (:) [], RuntimeException ? + FullyQualifiedErrorId: BadOperatorArgument

Похоже параметра $ liblist равна нулю, даже если переменная не является. Что дает?

Вот сценарий:

[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 

Спасибо.

ответ

0

Ваша функция Inventory-DPMLibraries ожидает параметр ($liblist):

Function Inventory-DPMLibraries ($liblist) { 
    ... 
} 

Однако, вы не предоставляете этот параметр при вызове функции:

Try { 
    Inventory-DPMLibraries 
} 
Catch { 
    Write-Error $_ 
    Exit 
} 

Изменить выше в этом:

Try { 
    Inventory-DPMLibraries $liblist 
} 
Catch { 
    Write-Error $_ 
    Exit 
}
+0

Спасибо, что обращается к первому вопросу. Я знал, что это было что-то простое, потому что я исправил его один раз :) Теперь, почему параметр $ liblist пуст при передаче в Update-TapeStatus? – StackExchangeGuy

+1

'' * slot * "' не является допустимым регулярным выражением. '*' указывает «ноль или больше» предшествующего ему символа. Поскольку вы начинаете с символа '*', перед ним нет символа. Либо измените параметр '-notmatch' на' -notlike', либо измените регулярное выражение на просто слот ''. Или если вы ожидаете совпадения с буквальными символами '*', используйте '' \ * slot \ * "'. –

Смежные вопросы