2015-12-14 36 views
2

如何转义传递给get-service的变量?我正在传递$ _。NAME,并且这个名称将包含$(美元)符号,导致它失败。

如何告诉powershell不考虑该变量的$内部并将其传递给get-service并仍然有效?

foreach($machine in $machines) {  
    Write-Output "$machine ACTIVE NOW: "  
    Write-Output "---------------------------------" 
    Get-Service -name "*sql*" -computername $machine -ErrorAction SilentlyContinue | 
     Sort-Object -Property DisplayName | 
     foreach{ 
      $k = $machine + " - " + $_.DisplayName 
      $v = $_Status 
      $serviceStatus[$k] = $v 

      Get-Service `$_.Name | Select-Object -ExpandProperty ServicesDependedOn | 
      foreach{ 
       $kd = $k + "has a dependency on " + $_.DisplayName 
       $s = $_.Status 
       $serviceStatus[$kd] = $s 
      } 
     } 
} 
+0

您是否尝试过使用转义字符 '\'?另外,不知道这与数据库有什么关系......? –

+0

只为那些试图关闭这个问题,它实际上不属于SO。如果有什么问题可以转移到SF上,但是DBA.SE还有其他一些关于管理SQL Server服务的问题(无论你只是提取信息还是故障排除)......所以它确实属于[对此可以提出什么问题站点(http://dba.stackexchange.com/help/on-topic)。 –

+0

@ ShawnMelton:我不知道这个问题是否是关于SF的话题,但我相信它对于SO来说是完全正确的,并且在很大程度上比DBA.SE.我不相信仅仅因为PowerShell是一个通用的(而不是特定于数据库的)脚本环境,而是因为所讨论的问题是通用的而不是数据库特定的。 –

回答

4

你不应该逃避什么时候用你的脚本,它应该如果你$_.Name卸下后蜱工作。

当您使用脚本中的方法传递属性时,PowerShell足够聪明,可以接受带有特殊字符的值作为字面值。如果用双引号"$_.Name"包装它,则SQL Server将尝试评估该表达式,并只传递实例服务名称的MSSQL

该命令没有任何错误运行我的机器上:

Get-Service -name "*SQL*" -ErrorAction SilentlyContinue | 
sort-object -Property DisplayName | 
foreach { Get-Service $_.Name | select -ExpandProperty ServicesDependedOn} 

enter image description here