我正计划通过遍历文本文件为源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"
答案 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