如何在双引号字符串中使用对象的属性?

如何在双引号字符串中使用对象的属性?

我有以下代码:

$DatabaseSettings = @();$NewDatabaseSetting = "" | select DatabaseName, DataFile, LogFile, LiveBackupPath;$NewDatabaseSetting.
DatabaseName = "LiveEmployees_PD";$NewDatabaseSetting.DataFile = "LiveEmployees_PD_Data";$NewDatabaseSetting.LogFile = "LiveEmployees_PD_Log";
$NewDatabaseSetting.LiveBackupPath = '\\LiveServer\LiveEmployeesBackups';$DatabaseSettings += $NewDatabaseSetting;

当我尝试使用字符串执行命令中的一个属性时:

& "$SQlBackupExePath\SQLBackupC.exe" -I $InstanceName -SQL `
  "RESTORE DATABASE $DatabaseSettings[0].DatabaseName FROM DISK = '$tempPath\$LatestFullBackupFile' WITH NORECOVERY, REPLACE,
   MOVE '$DataFileName' TO '$DataFilegroupFolder\$DataFileName.mdf', MOVE '$LogFileName' TO '$LogFilegroupFolder\$LogFileName.ldf'"

它只使用$DatabaseSettings而不是$DatabaseSettings[0].DatabaseName,这是无效的。
我的解决办法是将它复制到一个新变量中。

如何以双引号字符串直接访问对象的属性?


湖上湖
浏览 703回答 3
3回答

慕后森

当您将变量名括在双引号字符串中时,它将被该变量的值替换:$foo = 2"$foo"成"2"如果您不想使用单引号,则必须使用单引号:$foo = 2'$foo'但是,如果您想要访问属性,或者在双引号字符串中对变量使用索引,则必须将该子表达式括在$():$foo = 1,2,3"$foo[1]"     # yields "1 2 3[1]""$($foo[1])"  # yields "2"$bar = "abc""$bar.Length"     # yields "abc.Length""$($bar.Length)" # yields "3"Powershell只在这些情况下扩展变量,仅此而已。要强制计算更复杂的表达式,包括索引、属性,甚至是完整的计算,您必须将这些表达式包含在子表达式运算符中。$( )它将导致计算内部的表达式并将其嵌入到字符串中。

慕姐4208626

只是想多加一点,说明为什么你需要用$():示例代码包含一个歧义,这说明了为什么PowerShell的制作者可能选择将扩展限制为仅仅是变量引用,而不支持对属性的访问(顺便说一句:字符串扩展是通过调用ToString()方法,可以解释某些“奇数”结果)。您的示例包含在命令行的末尾:...\$LogFileName.ldf如果对象的属性在默认情况下被展开,上述将解析为...\由于$LogFileName不会有一个名为ldf, $null(或空字符串)将替换变量。
打开App,查看更多内容
随时随地看视频慕课网APP