变量内部的Powershell点源变量未扩展

时间:2019-08-05 14:10:07

标签: powershell

我遇到以下问题:

说我有两个Powershell脚本,分别是A.ps1和conf.ps1。

conf.ps1的内容只是A.ps1的点源变量,例如:

$dateLogs          = Get-Date -UFormat '%Y%m%d'
$installDir        = 'C:\Gcloud\'
$logDir            = '$installDir\GcloudLogs'
$logFile           = '$logDir\$dateLogs\logFile.txt'

导入后,有趣的是$dateLogs被扩展了,在调试器中我可以看到"..\20190805\logFile.txt"$installDir出于某种原因不会扩展。

因此,我没有拥有$logFile = "C:\Gcloud\GcloudLogs\20190805\logFile.txt",而是拥有"$installDir\GcloudLogs\20190805\logFile.txt",而$installDir永远不会扩展到其真实价值。

我想念什么吗?

自从我为此苦苦挣扎很长时间以来,任何领导都会非常感激。我尝试了几种方法:

- ${$installDir}\GcloudLogs
- $($installDir\GcloudLogs)
- $(${installDir}\GcloudLogs)

用单引号,双引号和根本没有引号...都没有解决。

谢谢大家。

2 个答案:

答案 0 :(得分:2)

为了不使单引号或双引号引起混淆,并使您免于使用带有双反斜杠的路径,使用Join-Path cmdlet总是更安全。

$dateLogs   = '{0:yyyyMMdd}' -f (Get-Date)                                # a more 'PowerShelly' way of formatting a date
$installDir = 'C:\Gcloud'
$logDir     = Join-Path -Path $installDir -ChildPath 'GcloudLogs'
$logFile    = Join-Path -Path $logDir -ChildPath "$dateLogs\logFile.txt"  # use double-quotes here

还可以使用.NET [System.IO.Path]::Combine()函数

$dateLogs   = '{0:yyyyMMdd}' -f (Get-Date)
$installDir = 'C:\Gcloud'
$logDir     = [System.IO.Path]::Combine($installDir, "GcloudLogs")
$logFile    = [System.IO.Path]::Combine($logDir, $dateLogs, "logFile.txt")

这两个方法都会创建以下路径:

$logDir   --> C:\Gcloud\GcloudLogs
$logFile  --> C:\Gcloud\GcloudLogs\20190805\logFile.txt

答案 1 :(得分:0)

在Powershell中,字符串常量中的单引号和双引号之间是有区别的。尝试改为使用双引号。