2016-04-15 8 views
1

Ich bin neu, vielleicht ist dies nur etwas, was ich brauche, erklärt.PowerShell mit SQL Server SMO mit Split-Path

Bei der Arbeit mit PoSH mit SQL Server SMO möchte ich den Pfad für Tempdb erhalten. Ich habe den Code geschrieben, um die Daten, die ich will, zu ziehen, aber die Ergebnisse sind nicht das, was ich erwarte.

Es gibt:

@ {filename = C: \ Programme \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ DATA

Was ich erwartet hatte:

C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSQLSERVER \ MSSQL \ DATEN

Kann mir jemand bitte erziehen?

Beispiel: (SMO müssen bereits geladen werden)

$ServerName = 'LOCALHOST' #testing code 
$server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName 
$server.Databases.FileGroups.Files | where-object {$_.Name -eq 'tempdev'} | select FileName | Split-Path -Parent 

Danke, Josh

Antwort

1

ändern, die letzte Zeile:

($server.Databases.FileGroups.Files | 
    where-object {$_.Name -eq 'tempdev'}).Filename | 
    split-path -Parent; 

Eine einfache Erklärung, dass die Art und Weise ist Sie haben es geschrieben, das select FileName gibt immer noch ein DataFile-Objekt zurück (wenn auch eines, das nur die Eigenschaft Dateiname besitzt). Wenn Sie den Teil umbrechen, in dem Sie die Datei in Parens erhalten und dann .FileName aufrufen, erhalten Sie eine Zeichenfolge zurück. Welcher Teilpfad ist etwas glücklicher?

+0

Große Rückmeldung. Vielen Dank. –

2

Sie würden wollen, entweder versuchen:

$server.Databases.FileGroups.Files | 
    where-object {$_.Name -eq 'tempdev'} | 
    select -ExpandProperty FileName | 
    Split-Path -Parent 

Oder:

$server.Databases.FileGroups.Files | 
    where-object {$_.Name -eq 'tempdev'} | 
    ForEach-Object FileName | 
    Split-Path -Parent 

Das grundlegende Problem ist, dass Sie falsch verstanden haben, was Select-Object tut. Es gibt ein Objekt mit den Eigenschaften, nicht die Eigenschaft selbst zurück.

Sehen Sie, ob dies hilft. Hier ist Select-Object mit einer Eigenschaft:

PS C:\> $x = gci C:\Windows\notepad.exe | Select FullName 
PS C:\> $x 

FullName 
-------- 
C:\Windows\notepad.exe 


PS C:\> $x.FullName 
C:\Windows\notepad.exe 
PS C:\> $x.GetType().Name 
PSCustomObject 

Und hier sehen wir es das gleiche Verhalten mit mehreren Eigenschaften:

PS C:\> $x = gci C:\Windows\notepad.exe | Select FullName, Length 
PS C:\> $x 

FullName    Length 
--------    ------ 
C:\Windows\notepad.exe 244736 


PS C:\> $x.FullName 
C:\Windows\notepad.exe 
PS C:\> $x.GetType().Name 
PSCustomObject 

Und hier ist es wieder mit dem -ExpandProperty Parameter.

PS C:\> $x = gci C:\Windows\notepad.exe | Select -ExpandProperty FullName 
PS C:\> $x 
C:\Windows\notepad.exe 
PS C:\> $x.GetType().Name 
String 
PS C:\> $x.FullName 
PS C:\> 

sollten Sie in der Lage sein | Select -ExpandProperty FullName mit | ForEach-Object FullName zu ersetzen und das gleiche Verhalten zu sehen. Beachten Sie, dass Sie nur einen Parameter mit einer dieser Methoden angeben können.

+0

Tolles Feedback. Vielen Dank. –

+0

Ich vergesse immer "-ExpandProperty"! –

Verwandte Themen