Test-Path - переменная часть FileName - переменная не подставляется - PullRequest
0 голосов
/ 24 августа 2018

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 не заменяет значение переменнойпока ищу файл.Он печатает ниже.

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

Я ожидаю, что значение $tminus1 подставляется как 20180823, так что часть else печатает ниже.

<somepath>\filename_$tminus1.csv exists

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Проблема в том, что когда вы извлекаете текст из CSV, он обрабатывается как литерал, как если бы он был строкой в ​​одинарных кавычках. Вы можете заставить PowerShell переоценивать строку следующим образом:

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

Или альтернативным методом было бы изменить текст в CSV следующим образом:

<somepath>\filename_{0}.csv

Затем вы можете использовать строку формата для применения переменной следующим образом:

$file = $file -f $tminus1
0 голосов
/ 24 августа 2018

Когда вы читаете строки из файла, 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

Очевидно, что вы можете захватывать их в переменную, отправлять их по конвейеру и т. д. вместо того, чтобы просто выводить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...