为路径组合路径,文件字符串和文字

时间:2017-08-24 21:25:03

标签: powershell filepath

尝试组合路径,文件名,并添加一些文本以及Out-File日志的变量。

我尝试了很多替代方案但未成功,需要帮助;

FormattedDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$OldVersion = C:\Temp\TestFile.txt
$OldPath = (Get-Item $OldVersion).DirectoryName
$OldBaseName = (Get-Item $OldVersion).BaseName
ErrFile = Join-Path $OldPath OldBaseName

Out-File -FilePath "$ErrFile_$FormattedDate Error.txt"
Out-File -FilePath "$($OldPath)$($OldBaseName)_$($FormattedDate)_Error.txt"

......只是两个例子。

我尝试了许多其他组合并让我发疯。

基本上我希望它成为。

C:\Temp\TestFile_2017-08-24 16:51:36_Error.txt

更新

我已经尝试过两次

$filename = '{0}_{1:s}_Error{2}' -f $basename, (Get-Date), $extension

我得到_2017-08-25T13:02:17_Error.txt但没有基本名称(TestFile)。

$newpath = "${dirname}\${basename}_${date}_Error${extension}"

我得到了

  

名称为' _2017-08-25 13'不存在。

您是否还可以解释或提供'{0}_{1:s}_Error{2}'和/或'{0}_{1:yyyy-MM-dd HH:mm:ss}_Error{2}'所做的资源?

1 个答案:

答案 0 :(得分:1)

使用format operator-f)构建文件名,使用Join-Path构建路径。

$oldpath   = 'C:\Temp\TestFile.txt'

$basename  = [IO.Path]::GetFileNameWithoutExtension($oldpath)
$extension = [IO.Path]::GetExtension($oldpath)

$filename  = '{0}_{1:yyyy-MM-dd HH:mm:ss}_Error{2}' -f $basename, (Get-Date), $extension

$newpath   = Join-Path ([IO.Path]::GetDirectoryName($oldpath)) $filename

除非您必须拥有日期格式的空格,否则您可以使用standard sortable format specifiers)来简化格式字符串,这将生成2017-08-24T23:58:25而不是{{1}之类的日期字符串}}

2017-08-24 23:58:25

如果要将路径构造为带有内联变量的字符串,则需要确保文件名中的下划线与变量名称保持独立。由于下划线是变量名$filename = '{0}_{1:s}_Error{2}' -f $basename, (Get-Date), $extension 的有效名称组件,因此变量$var_,而不是变量var_后跟文字下划线。使用花括号来确保变量和文字下划线不会混淆。

var

附录:您的文件名不应包含冒号。 Windows路径中的冒号终止驱动器名称或将文件名与alternate data stream的名称分开。您的日期格式字符串应该类似于$oldpath = 'C:\Temp\TestFile.txt' $date = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss') $dirname = [IO.Path]::GetDirectoryName($oldpath) $basename = [IO.Path]::GetFileNameWithoutExtension($oldpath) $extension = [IO.Path]::GetExtension($oldpath) $newpath = "${dirname}\${basename}_${date}_Error${extension}" yyyy-MM-dd HH-mm-ss,以避免此陷阱。