路径中有多个变量

时间:2018-12-13 21:51:05

标签: powershell

我正计划通过遍历文本文件为源PDF的位置设置变量,并指定路径来创建一个新文件夹(带有星期编号)以将源PDF移至以下位置,从而使用以下脚本。 / p>

$pdfSource = 'C:\path\in\text\file'
$newFolder = 'C:\path\to\newfolder\in\text\file'
Get-ChildItem $pdfSource '*.pdf' -Recurse | foreach {
    $x = $_.LastWriteTime.ToShortDateString()
    $new_folder_name = Get-Date $x -UFormat %V
    $des_path = "C:\path\to\newfolder\$new_folder_name"

    if (Test-Path $des_path) {
        Move-Item $_.FullName $des_path
    } else {
        New-Item -ItemType Directory -Path $des_path
        Move-Item $_.FullName $des_path
    }
}

我似乎无法弄清楚下面一行的语法,其中包括$newFolder路径变量以及我正在创建的现有$new_folder_name

$des_path = "C:\path\to\newfolder\$new_folder_name"

2 个答案:

答案 0 :(得分:5)

选项1:

$des_path = "${newFolder}\${new_folder_name}"

选项2:

$des_path = "${0}\${1}" -f $newFolder, $new_folder_name

选项3:

$des_path = $newFolder + $new_folder_name

选项4:

$des_path = Join-Path -Path $newFolder -ChildPath $new_folder_name

答案 1 :(得分:2)

字符串扩展(插值)的方法没有错:

$new_folder_name = 'foo' # sample value
$des_path = "C:\path\to\newfolder\$new_folder_name" # use string expansion

按预期产生字符串文字C:\path\to\newfolder\foo

from here向您展示了构建文件路径的替代方法,其中Join-Path是最健壮且PowerShell惯用的,尽管速度很慢。
另一种选择是使用[IO.Path]::Combine()

[IO.Path]::Combine('C:\path\to\newfolder', $new_folder_name)

如果您当前的语言不是$new_folder_name(美国英语),但是由于存在错误,那么计算en-US 的值的方式应该有问题。 t [1] ;无论哪种方式,都应该简化:

代替:

$x = $_.LastWriteTime.ToShortDateString()
$new_folder_name = Get-Date $x -uformat %V

使用:

$new_folder_name = Get-Date $_.LastWriteTime -uformat %V

也就是说,将$_.LastWriteTime 直接传递给Get-Date作为[datetime]实例-无需通过字符串表示形式绕行


[1] .ToShortDateString()返回一个文化敏感的字符串表示形式,而PowerShell通常使用不变文化来确保跨文化一致性。因此,如果将 string 传递给接受[datetime]实例的参数,则应该(仅)识别出 invariant 区域性格式,而不是当前文化。尽管对于 PowerShell 中编写的功能来说是正确的,但在编译的cmdlet (通常基于C#)中, current 文化出乎意料地应用;虽然这是一个 bug ,但出于向后兼容性的考虑,已决定不对其进行修复-参见Adam's answer