2016-11-25 10 views
0

私はコードに矛盾があり、それが何であるか分かりません。私は出力を取得し、最初の行の$日付の下に、最終的なGetChildItemラインを移動する場合Get-Itemとの競合

は、ここでプログラム

$Date = Get-Date -Format MM-dd-yyyy-HH-mm-ss-tt 

<#*****SQL Session Variables*****#> 
$Username = "sa" 
$Password = "xyz" | ConvertTo-SecureString -asPlainText -Force 
$Credentials = New-Object System.Management.Automation.PSCredential($Username,$Password) 

$DatabaseNames = Invoke-SQLcmd -Query "Select * From sys.databases WHERE Name NOT LIKE '%Master%' AND Name NOT LIKE '%Tempdb%' AND Name NOT LIKE '%Model%' AND Name NOT LIKE '%Msdb%';" -ServerInstance "localhost" | Select Name -ExpandProperty Name 
Write-Host "****Database Names****" -ForeGroundColor Red -BackGroundColor Black 
$DatabaseNames 
"`n`n" 

<#****Get Database Size****#> 
Push-Location 
Import-Module sqlps -disablenamechecking 
Invoke-Sqlcmd -Query "select name, physical_name, size * 8.0/1024 size from sys.master_files WHERE Type_Desc NOT LIKE '%LOG%' AND Name NOT LIKE '%Master%' AND Name NOT LIKE '%Tempdb%' AND Name NOT LIKE '%Model%' AND Name NOT LIKE '%Msdb%';" -ServerInstance "localhost" | Select @{Label="Database Name";Expression={$_.name}}, @{Label="Location";Expression={$_.physical_name}}, @{Label="SIze (MB)";Expression={$_.size}} 
Pop-Location 
"`n" 
Start-Sleep 4 

<#****Backup Databases****#> 
ForEach ($DatabaseName in $DatabaseNames) 
{ 
$SQLBackupPath1 = "C:\T2\SQlBackup\" 
$SQLBackupPath2 = "$DatabaseName" 
$SQLBackupPath3 = "_" 
$SQLBackupPath4 = $Date 
$SQLBackupPath5 = "_.bak" 
$SQLBackupPath = $SQLBackupPath1 + $SQLBackupPath2 + $SQLBackupPath3 + $SQLBackupPath4 + $SQLBackupPath5 
$SQLBackupPath 

Backup-SQLDatabase -ServerInstance localhost -Database $DatabaseName -BackupFile $SQLBackupPath -Credential $Credentials 
Write-Host "Database Backup of " -NoNewLine 
Write-Host "$DatabaseName" -ForeGroundColor Red -BackGroundColor Black -NoNewLine 
Write-Host " has been completed" 
"`n" 
} 

<#****Delete Databases****#> 
ForEach ($DatabaseName in $DatabaseNames) 
{ 
Push-Location 
Import-Module sqlps -disablenamechecking 
Invoke-Sqlcmd -Query "EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'$DatabaseName';" -ServerInstance "localhost" 
Invoke-Sqlcmd -Query "USE [master];" -ServerInstance "localhost" 
Invoke-Sqlcmd -Query "ALTER DATABASE [$DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;" -ServerInstance "localhost" 
Invoke-Sqlcmd -Query "DROP DATABASE [$DatabaseName];" -ServerInstance "localhost" 
Pop-Location 
Write-Host "Database: " -NoNewLine 
Write-Host "$DatabaseName" -ForeGroundColor Red -BackGroundColor Black -NoNewLine 
Write-Host " has been Dropped" 
"`n" 
} 

Get-ChildItem -Path C:\T2\SQLBackup\ | Where-Object {$_.Name -match "ApOps*" } | Sort-Object LastWriteTime -Descending 

です。しかし、これをループで使用したり、現在の場所に置いたりすると結果は返されません。これは、コードに矛盾する記述があると私に信じさせる。もしそうなら、私はそれを見つけることができないと私はそれを探して私の心を失っています。助けてください。

答えて

2

あなたは出力フォーマットに噛まれていて、あなたの出力に少し不注意です。シンプル

リストファイルを、と正常に動作します::このことを考慮して、私はファイルのカップルとディレクトリにいるよ、

PS D:\test> Get-ChildItem # list the files 


    Directory: D:\test 

Mode    LastWriteTime   Length Name                         
----    -------------   ------ ----                         
-a----  02/11/2016  07:01   1640 log.txt                        
-a----  02/11/2016  07:01    0 testfile                        

出力空の文字列は、その後、ファイルをリストシンプルで正常に動作します。最初に空白行が1行追加されます。

PS D:\test> ""; Get-ChildItem 



    Directory: D:\test 

Mode    LastWriteTime   Length Name                         
----    -------------   ------ ----                         
-a----  02/11/2016  07:01   1640 log.txt                        
-a----  02/11/2016  07:01    0 testfile                        

文字列の長さを取得し、ファイルを一覧表示します。待って?出力フォーマッタは、あなたがそれを受信した最初の出力(文字列長)からを求めプロパティを取っているし、その後、パイプラインが空になるまで、それは(ファイル)を受信し、すべてのことに適用されます。

PS D:\test> "" | select Length; Get-ChildItem # select string length, then... 

Length  # missing columns ??!! 
------  
    0  # string length 
    1640  # file length 
    0  # file length 

」doesnのいくつかのプロパティを取得します。存在しない場合は、ファイルをリストします。 Foobarは、どちらかのタイプに存在しないので、これは、この時期だけ、それはファイルの文字列か何かのために何を示していないのと同じ考え方です:あなたはこの種のものをやっている

PS D:\test> "" | select Foobar; Get-ChildItem # select property which doesn't exist 

Foobar 
------ 
     # ???? this is your "no output" 

- 混合型を送信します出力パイプラインに出力します。それらは変数に取り込んだり、ファイルに書き込んだりすると出力に行きますが、コンソールに表示する方法を試してみる出力フォーマッタが最初に取得し、出力をフォーマットしますこれに対して、あなたは一貫した出力を持つと仮定します。そして、それはここにあなたのコードから来ます最初の複雑なオブジェクト:

Invoke-Sqlcmd -Query "select name, physical_name, size * 8.0/1024 size from sys.master_files WHERE Type_Desc NOT LIKE '%LOG%' AND Name NOT LIKE '%Master%' AND Name NOT LIKE '%Tempdb%' AND Name NOT LIKE '%Model%' AND Name NOT LIKE '%Msdb%';" -ServerInstance "localhost" | Select @{Label="Database Name";Expression={$_.name}}, @{Label="Location";Expression={$_.physical_name}}, @{Label="SIze (MB)";Expression={$_.size}} 


# where you select these properties for display: 
# Database Name, Location, Size (MB) 

# None of these properties exist on files or directories, 
# so they don't get shown on screen. 

修正:

$x = Invoke-SqlCmd ___ 
$y = Get-ChildItem 

$x | Format-Table 
$y | Format-Table 

またはファイルへのより多くの書き込みホスト、または出力を使用します。

+0

ありがとうございます。私は基本的にあなたが話していたことを理解するために数回それを読む必要があったが、それを煮沸する。あなたは| Format-Tableは画面上で見た目がよく見えますが、変数のデータをねじ込みます。私がそれをしたら、私はビジネスに戻った。申し訳ありませんが、私はそれを忘れてこの答えを受け入れるために私が長くかかった。 – JRN

+0

私はよく言いますが、それは本当ですが、私が主に言っていたのは、出力ストリームに型を混ぜると、自動フォーマッタが混乱してすべてのものを表示できないため、あなたはそれを回避する必要があります。 – TessellatingHeckler