2011-12-06 11 views
1

Im Powershellには非常に新しく、「古い」フォルダをチェックして見つからない場合は作成するスクリプトのために次のコードをまとめました。次に、圧縮されたウェブログを現在の場所から '古い'フォルダに移動します。私はこれが夜間に実行するようにセットアップすることができ、新しいサーバーまたは削除されたサーバーで更新する必要がないように、SQLクエリからサーバー名とWebサイト名を取得するように書かれています。私はこれまでのところ書かれているが、私が新しいので、最後の構文を理解することはできない。私がやりたい何2つのSQLクエリをパラメータとして渡すためのデータセットとして渡す

clear 
$SqlServer = "SERVER" 
$SqlCatalog = "DATABASE" 
$SqlQuery = "select hsa.servername from SERVER.dbo.serversapp hsa 
inner join SERVER.dbo.apphosts hah on hsa.vchservername = hah.vchservername 
where hsa.tirecordstatus = 1 
order by hsa.vchservername desc" 
$SqlQuery1 = "select hah.vchhost from SERVER.dbo.serversapp hsa 
inner join SERVER.dbo.apphosts hah on hsa.vchservername = hah.vchservername 
where hsa.tirecordstatus = 1 
order by hsa.vchservername desc" 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SqlServer; Database = $SqlCatalog; Integrated Security = True" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 
$DataSet.Tables[0] 

はそれぞれ$のSQLQueryはので、私は次のコードのパラメータとしてそれぞれを渡すことができ、それ自身のデータセットテーブル内の各1を実行して、保存しています。私が理解しなければならないのは:

1)私は両方のSQLクエリを実行し、それぞれを自分自身のデータセットまたはテーブルにするために、どのように記述すればよいのですか? $ Servernameと$ HostedGroup?

2)$ Servernameパラメータから各サーバで以下のコードを再帰的に繰り返すように設定するにはどうすればよいですか?

$Servername = Dataset1 
$Hostedgroup = Dataset2 
$OldFolder = "\\$Servername\C$\Ren\Weblogs\$Hostedgroup\old" 
$FolderExists = Test-Path $OldFolder 


if($FolderExists -eq $False) 
{ 
new-item \\$Servername\C$\Ren\Weblogs\$Hostedgroup\old -type directory 
} 
then 
{ 
if(Test-Path \\$Servername\C$\Ren\Weblogs\old\W3SVC2) 
{ 
get-childitem -path '\\$Servername\C$\Ren\WebLogs\$Hostedgroup\W3SVC2' -recurse -include *.zip | move-item -destination '\\$Servername\C$\Ren\WebLogs\$Hostedgroup\old' 

答えて

1

$SqlAdapter.Fill($DataSet)は整数を返します。スクリプト/関数が$nullに割り当てたり、Out-Nullを使用してスクリプト/関数を返すのを防ぐ必要があります。 (例:$null = $SqlAdapter.Fill($DataSet)

質問に対する回答として、1つのクエリから両方のフィールドを返してから、結果を繰り返し処理できます。パターンは次のようになります。

function Get-HostedServerApp { 
    $SqlServer = "SERVER" 
    $SqlCatalog = "DATABASE" 
    $SqlQuery = @" 
select hsa.vchappservername, hah.vchhost 
from SERVER.dbo.hostedserversapp hsa 
inner join SERVER.dbo.hostedapphosts hah on hsa.vchappservername = hah.vchappservername 
where hsa.tirecordstatus = 1 
order by hsa.vchappservername desc 
"@ 
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
    $SqlConnection.ConnectionString = "Server = $SqlServer; Database = $SqlCatalog; Integrated Security = True" 
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
    $SqlCmd.CommandText = $SqlQuery 
    $SqlCmd.Connection = $SqlConnection 
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
    $SqlAdapter.SelectCommand = $SqlCmd 
    $DataSet = New-Object System.Data.DataSet 
    $null = $SqlAdapter.Fill($DataSet) 
    $SqlConnection.Close() 
    $Dataset.Tables[0] 
} 

# Place your logic in this function 
function SomeFunction { 
    param(
    $Servername, 
    $Hostedgroup 
    ) 

    "\\$Servername\C`$\Renaissance\Weblogs\$Hostedgroup\old" 
} 

$data = Get-HostedServerApp 

$data| foreach{SomeFunction -ServerName $_.vchappservername -HostedGroup $_.vchhost} 
+0

でした。この例の最後の行では、 'Get-HostedServerApp'から返されたレコードは' foreach' CmdLet(完全名は 'ForEach-Object'です)に渡されます。 'Foreach'は、パイプラインを渡されたオブジェクトごとにスクリプトブロックを実行します。詳細は 'help ForEach-Object -Online'を参照してください。 – Rynant

+0

'\\ $ Servername \ C' $ \ Renaissance \ Weblogs \ $ Hostedgroup \ old'は単にコードのプレースホルダとして追加されます。この関数の上のコメントでは、次のように書いています: '#あなたのロジックをこの関数に入れよう ' – Rynant

+0

あなたの関数では、これらのパラメータは必要ありません:$ Servername = Dataset1 <------------- - $ Hostedgroup = Dataset2 <-------------- – bbinnebose

関連する問題