PowerShell - 连接两个带有下划线的字符串不起作用?

问题描述 投票:0回答:1

我正在尝试将时间戳附加到文件名,然后将该文件移动到另一个目录中。 这是一个代码示例:

$sourceFiles= Get-ChildItem $sourcePath\* -Include *.csv

ForEach($sourceFile in $sourceFiles)
{
    $fileNameWithoutExtension = $sourceFile.BaseName
    $timestamp = $(Get-Date -f yyyy-MM-dd_HH-mm_ss)
    $processedFile = Join-Path -Path $processedPath -ChildPath "$fileNameWithoutExtension_$timestamp.csv"   
    Move-Item -Path $sourceFile -Destination $processedFile
}

当我执行此操作时,似乎

"$fileNameWithoutExtension_$timestamp.csv"
完全忽略了
$fileNameWithoutExtension
变量的内容,仅将时间戳包含在文件名中。我也已经对此进行了调试并检查了
$fileNameWithoutExtension
变量的内容,它确实包含正确的文件名,但没有扩展名。为什么会这样以及如何正确创建文件名?

string powershell concatenation string-concatenation
1个回答
4
投票

这是因为下划线是变量名称中的有效字符(请参阅here),因此 PowerShell 基本上连接

$fileNameWithoutExtension_
+
$timestamp
+
.csv
。第一个变量(名称包括下划线)不存在,因此它被解释为 null / 空。

尝试以下解决方案之一(当然,还有更多):

# curly-bracket-notation for variables
"${fileNameWithoutExtension}_${timestamp}.csv"

# sub-expression operator
"$($fileNameWithoutExtension)_$($timestamp).csv"

# escape character
"$fileNameWithoutExtension`_$timestamp.csv"

# format operator
"{0}_{1}.csv" -f $fileNameWithoutExtension, $timestamp

# string concatenation
($fileNameWithoutExtension + "_" + $timestamp + ".csv")
© www.soinside.com 2019 - 2024. All rights reserved.