2016-11-25 3 views
0

Ich habe eine Codezeile, die einige Konflikte enthält, und ich kann einfach nicht sehen, was es ist.Konflikt mit Get-Item

Hier ist das Programm

$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 

Wenn ich die letzte GetChildItem Linie unter dem ersten Zeile $ Date I-Ausgang bekommen bewegen. Wenn ich dies jedoch in einer Schleife verwende oder wo es momentan sitzt, werden keine Ergebnisse zurückgegeben. Dies lässt mich glauben, dass es im Code eine widersprüchliche Aussage gibt. Wenn das der Fall ist, kann ich es nicht finden und ich verliere meinen Sinn dafür. Bitte helfen Sie.

Antwort

2

Sie werden von der Ausgabeformatierung gebissen und sind mit Ihrer Ausgabe ein wenig unvorsichtig. Betrachten Sie diese, ich bin in einem Verzeichnis mit ein paar Dateien:

Liste der Dateien, einfach und funktioniert gut:

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                        

Ausgang ein leerer String, dann die Dateien aufzulisten, einfach und funktioniert gut. Eine Leerzeile am Anfang:

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                        

Ermitteln Sie die Zeichenfolgenlänge, und listen Sie die Dateien auf. Warte was? Die Ausgangsformatierer nimmt Eigenschaft Sie von der ersten Ausgabe fragte sie (string Länge) erhält und dann die Anwendung, die es empfängt (Dateien), um alles bis die Pipeline leer ist:

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

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

eine Eigenschaft erhalten, die ‚doesn t existieren, dann listet die Dateien auf. Dies ist die gleiche Idee, nur diesmal ist es nichts für die Zeichenfolge oder etwas für die Dateien zeigt, weil Foobar nicht auf jede Art existieren:

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

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

Sie diese Art der Sache zu tun - Mischtypen zu senden zur Ausgangspipeline. Sie gehen immer noch zur Ausgabe, wenn Sie sie in Variablen erfasst haben oder sie in Dateien geschrieben haben, würden die Daten dort sein, aber der Ausgabeformatierer, der versucht, herauszufinden, wie sie auf der Konsole angezeigt werden, nimmt das erste, was er bekommt und formatiert die Ausgabe dagegen vorausgesetzt, Sie haben eine konsistente Ausgabe. Und die ersten komplexen Objekte, die es hier aus dem Code kommen wird:

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. 

Fix:

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

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

oder mehr Write-Host verwenden, oder die Ausgabe an Dateien.

+0

Vielen Dank für Ihre Hilfe. Ich musste es im Grunde ein paar Mal lesen, um zu verstehen, worüber du sprichst, aber es zu kochen. Du hast gesagt, dass du das | Format-Table, da es auf dem Bildschirm schön aussieht, aber die Daten in der Variablen durcheinander bringt. Sobald ich das getan hatte, war ich wieder im Geschäft. Entschuldigung, es dauerte so lange, bis ich diese Antwort akzeptierte. Ich vergaß es. – JRN

+0

Ich sage das oft, und das ist wahr, aber was ich hauptsächlich gesagt habe, war, wenn man Typen im Ausgabestrom mischt, der Autoformatierer verwirrt wird und nicht alle Dinge anzeigen kann, also sieht es so aus, als ob einige fehlen, und du musst es umgehen. – TessellatingHeckler