我有以下代码:
$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;
Run Code Online (Sandbox Code Playgroud)
当我尝试使用字符串执行命令中的一个属性时:
& "$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'"
Run Code Online (Sandbox Code Playgroud)
它试图只使用值$DatabaseSettings而不是值$DatabaseSettings[0].DatabaseName,这是无效的.
我的解决方法是将其复制到一个新变量中.
如何直接在双引号字符串中访问对象的属性?
今天,我在 Powershell 5.1 中使用制表符自动完成功能来输入变量名称,并注意到其中一个选项是 PSDrive 的名称。驱动器名称是docs,我想要扩展的驱动器名称是$document_name。当我输入 时$do<tab>,shell 确实扩展了我输入的内容$document_name,但由于某种原因,我第二次输入<tab>,此时扩展的文本更改为$docs:。
我进一步探索并发现我的每个 PSDrive 都存在这种类型的变量,或者至少选项卡扩展表明它确实存在。
\n\n更正式地说,对于每个 PSDrive PSD,选项卡扩展都认为这$PSD:是有效的事情。
我的问题很简单:这些到底是什么?以下是我迄今为止所做的一些观察:
\n\n$,因此它们看起来像 PS 变量。对于本次讨论的其余部分(以及上面前面的讨论),我将假设它们是变量并这样引用它们。Variable:像大多数变量一样列在 PSDrive 中。这样,它的行为就像$env“变量”,也没有在 中列出Variable:。我有一种感觉,如果我能找到有关 的文档$env,那么我也会理解这些对象。readme.txt包含文本“Hello, world!” 在名为 的 PSDrive 上code,则以下所有内容都可能与 Powershell 交互。获取文件的内容。
\n\n\xce\xbb ${code:\\readme.txt}\nHello, world!\nRun Code Online (Sandbox Code Playgroud)\n\n只是为了证明上面结果的类型是String:
在 PowerShell 中,为什么这不返回任何内容:
PS > $y = "$prid?api"
PS > echo $y
Run Code Online (Sandbox Code Playgroud)
但这些效果更好:
PS > $y = "$prid\?api"
PS > echo $y
18\?api
PS > $y = "${prid}?api"
PS > echo $y
18?api
Run Code Online (Sandbox Code Playgroud)