2016-11-25 85 views
0

我有一行代碼中有一些衝突,我只是看不到它是什麼。與獲取項衝突

這裏是程序

$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 

如果我提出的第一行$日期我得到的輸出下最終GetChildItem線。但是,如果我在一個循環中使用它,或者它現在位於沒有返回結果的位置。這使我相信代碼中有一些矛盾的陳述。如果是這樣,我似乎無法找到它,我正在失去主意尋找它。請幫忙。

回答

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                        

輸出一個空字符串,然後列出文件,簡單,工作正常。一個額外的空白行在開始:

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 

得到一些財產沒有按」 t存在,然後列出文件。這是同樣的想法,只是這一次它沒有顯示的字符串或任何的文件什麼的,因爲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

謝謝你對此的幫助。我基本上必須多讀幾遍才能理解你在說什麼,但要把它搞清楚。你在說要擺脫| |格式 - 表,因爲它在屏幕上看起來很漂亮,但把變量中的數據搞砸了。一旦我做到了,我又恢復了業務。對不起,我花了這麼長時間才接受這個答案,我忘了它。 – JRN

+0

我經常這麼說,那是真的,但我最常說的是當你在輸出流中混合類型時,自動格式化程序變得混亂,不能顯示所有的東西,所以看起來有些失蹤,你必須解決它。 – TessellatingHeckler