web-dev-qa-db-ja.com

DBATools-フラットファイル構成をエージェントジョブコマンドに渡します

SQLエージェントのジョブとスケジュールを.jsonファイルとしてソース制御し、それらを dbatools SQL Agentコマンドスイート でデプロイすることを試みています。

以下の形式の$sa = Get-Credentialおよびfoo.configが与えられます。

{
    "Schedule":                  "Foo",
    "Disabled":                  false,
    "FrequencyType":             "Weekly",
    "FrequencyInterval":         "EveryDay",
    "FrequencySubdayType":       "Time",
    "FrequencySubdayInterval":   0,
    "FrequencyRelativeInterval": "Unused",
    "FrequencyRecurrenceFactor": 1,
    "StartDate":                 "20180823",
    "EndDate":                   "20181023",
    "StartTime":                 "070000",
    "EndTime":                   "235959"
}

ソリューションでfoo.configを使用しようとしています 次のメッセージで基本的な解析に失敗します

~> $foo = Get-Content foo.config | ConvertFrom-Json
~> New-DbaAgentSchedule @foo -ServerInstance "." -SqlCredential $sa

警告:[15:50:04] [New-DbaAgentSchedule]スケジュールが提供されませんでした!スケジュール名を入力してください。

まあそれはひどいです...特に以下はうまくいくので...

$bar = @{
    Schedule=                  "Foo"
    Disabled=                  $false
    FrequencyType=             "Weekly"
    FrequencyInterval=         "EveryDay"
    FrequencySubdayType=       "Time"
    FrequencySubdayInterval=   0
    FrequencyRelativeInterval= "Unused"
    FrequencyRecurrenceFactor= 1
    StartDate=                 "20180823"
    EndDate=                   "20181023"
    StartTime=                 "070000"
    EndTime=                   "235959"
}

New-DbaAgentSchedule @bar -ServerInstance "." -SqlCredential $sa

個々の人をわざわざ入力したくない... -Param1 $foo.Param1 -Param2 $foo.Param2 ...怠け者だから。私は本当にむしろ splat 私の設定ファイルをさまざまなコマンドに入れたいと思います。 なぜこれが機能しないのか!!?!1!

2
Peter Vandivier

あなたができることの1つは、jsonから変換するときに、実際にそれをhastableに変換するオプションがあることです...これにより、数行のコードを節約できます。

(Get-Content C:\temp\foo.config | ConvertFrom-Json).GetType()
<#
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object
#>
(Get-Content C:\temp\foo.config | ConvertFrom-Json -AsHashtable).GetType()
<#
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object
#>

確認するためにアクセスできるサーバーがありませんが、2番目のコマンドの出力は、名前/値の形式であることを示しています。

Name                           Value
----                           -----
EndTime                        235959
StartDate                      20180823
FrequencySubdayInterval        0
FrequencyType                  Weekly
Schedule                       Foo
Disabled                       False
FrequencyRelativeInterval      Unused
EndDate                        20181023
FrequencySubdayType            Time
FrequencyInterval              EveryDay
StartTime                      070000
FrequencyRecurrenceFactor      1

上記はPowerShellCore 6.1(現在一般提供中)でのみ機能するため、PS Core内でdbatoolsを利用するには、 WindowsCompatibility モジュールを使用する必要があります。 PSCore内で次のコードを使用してこれを行うことができます。

Install-Module WindowsCompatibility
Import-WinModule dbatools

2番目のコマンドは、暗黙的なリモート処理をサポートするためにWinRmを利用します。上記は、WindowsマシンにPowerShellCoreをインストールしたことを意味します。ドキュメントには、必要に応じてリモートマシンでこれを行う方法が示されています。

そこから、必要に応じてdbatoolsコマンドを実行できます。

enter image description here

2
user507

ええと、4時間前に自分自身... $foo$barのタイプをわざわざ調べていたら、無駄にスクロールするときに、OpenOfficeのフロアプランで大声で宣誓する午後全体を無駄にしなかったかもしれません。ドキュメントを介して...

~> ($foo | Get-Member).TypeName[0]
System.Management.Automation.PSCustomObject

~> ($bar | Get-Member).TypeName[0]
System.Collections.Hashtable

PSCustomObjectHashTableに変換するための このQ&Aネットワークの便利で一般化されたソリューション もあります。

$foo.psobject.properties | foreach -begin {
    $foo=@{}
} -process {
    $foo."$($_.Name)" = $_.Value
} -end {$foo}

~> New-DbaAgentSchedule @foo -ServerInstance "." -SqlCredential $sa

簡単なピーシー、レモンスクイーズ。

だから飛び散る、あなたは大きな狂気。そして、あなたが愚かだと感じ終わったら、他の誰かを助ける場合に備えて、回避策をオンラインで共有してください。そして、あなたが非常に積極的だと感じているなら、多分、 モジュールに貢献する に時間を取っておくことを検討してください。

2
Peter Vandivier