【问题标题】:PowerShell using SQL Server SMO with Split-PathPowerShell 使用带有拆分路径的 SQL Server SMO
【发布时间】:2016-08-07 22:03:32
【问题描述】:

我是新手,所以也许这只是我需要解释的事情。

在使用带有 SQL Server SMO 的 PoSH 时,我想获取 tempdb 的路径。我已经编写了代码来提取我想要的数据,但是结果不是我所期望的。

返回:

@{FileName=C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA

我所期待的:

C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA

有人可以教我吗?

示例:(需要已经加载 SMO)

$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

谢谢, 乔什

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    你想试试:

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

    或者:

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

    基本的问题是你误解了Select-Object 在做什么。它返回具有您指定的属性的对象,而不是属性本身。

    看看这是否有帮助。这是Select-Object 的一个属性:

    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
    

    在这里我们看到它的行为与多个属性相同:

    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
    

    这里又是 -ExpandProperty 参数。

    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:\> 
    

    您应该能够将 | Select -ExpandProperty FullName 替换为 | ForEach-Object FullName 并看到相同的行为。请注意,您只能使用其中一种方法指定一个参数。

    【讨论】:

    • 很好的反馈。谢谢。
    • 我总是忘记-ExpandProperty
    【解决方案2】:

    将最后一行更改为:

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

    一个简单的解释是您编写它的方式,select FileName 仍然返回一个 DataFile 对象(尽管它只有 Filename 属性)。通过将获取文件的部分包装在括号中,然后在其上调用.FileName,您将得到一个字符串。哪条分割路径更让人高兴。

    【讨论】:

    • 很好的反馈。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2019-02-03
    相关资源
    最近更新 更多