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
答案 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
很显然,您可以将它们捕获到变量中,沿着管道发送它们,等等,而不仅仅是输出它们。