测试路径-FileName中的变量部分-变量不会被替换

时间:2018-08-24 12:09:25

标签: powershell

SourceFile.txt具有以下内容

<somepath>\filename_$tminus1.csv

以下是我编写的脚本。

$date = [DateTime]::ParseExact("21-Aug-18", "dd-MMM-yy", $null)

if ($date.DayOfWeek -eq "Monday") {
    $tminus1 = $date.AddDays(-3).ToString('yyyyMMdd')
    $tminus2 = $date.AddDays(-4).ToString('yyyyMMdd')
    Write-Host "Date vaulues set for Monday"
} else {
    $tminus1 = $date.AddDays(-1).ToString('yyyyMMdd')
    $tminus2 = $date.AddDays(-2).ToString('yyyyMMdd')
    Write-Host "Date vaulues set for Non-Monday"
}

$files = Get-Content -Path $PSScriptRoot\SourceFile.txt

foreach ($file in $files) {
    Convert-Path $file

    if (-not (Test-Path $file)) {
        echo ""
        Write-Host "$file doesn't exist"
    } else {
        echo ""
        Write-Host "$file exists"
    }
}

Test-Path cmdlet在查找文件时没有替换变量值。它显示以下内容。

<somepath>\filename_$tminus1.csv doesn't exist

我希望将$tminus1的值替换为20180823,以便else部分显示以下内容。

<somepath>\filename_$tminus1.csv exists

2 个答案:

答案 0 :(得分:3)

问题是,当您从CSV中提取文本时,将其视为文字,就好像它是单引号字符串一样。您可以强制PowerShell重新评估字符串,如下所示:

$file = $ExecutionContext.InvokeCommand.ExpandString($file)

或者另一种方法是将CSV中的文本更改为此:

<somepath>\filename_{0}.csv

然后您可以使用格式字符串来应用变量,如下所示:

$file = $file -f $tminus1

答案 1 :(得分:0)

当您从文件中读取字符串时,PowerShell不会对代码中的字符串执行常规的插值。解决此问题的一种方法是使用Invoke-Expression

假设您有一个文件(paths.txt),其中包含以下路径:

C:\Data\$dir1
C:\Data\$dir2

您可以得到如下真实路径:

$dir1 = "Directory1"
$dir2 = "Directory2"

Get-Content paths.txt |
    ForEach-Object {
        Invoke-Expression """$_"""
    }

这将输出:

C:\Data\Directory1
C:\Data\Directory2

很显然,您可以将它们捕获到变量中,沿着管道发送它们,等等,而不仅仅是输出它们。