我有一个名为files
的文件夹,其路径如下:C:\users\xxxx\desktop\files
在此文件夹中有不同的文件夹:2015-12-02
,2015-12-01
,2015-11-30
等
在每个文件夹中都有多个文件。我希望将文件夹日期附加到文件夹中每个文件的末尾。我为此编写了以下脚本:
function checkfile($file) {
$filenm = $file.FullName
return($filenm.Contains('.txt'))
}
function renamefile($file) {
$filenm = $file.Name
$ip = $file.FullName.Substring(34)
$ip1 = $ip.Substring(1,4) + $ip.Substring(6,2) + $ip.Substring(9,2)
$txt = $filenm.Split(".")[1] + "_" + $file.name.Split(".")[3] + "_" + $file.name.Split(".")[4] + "." + $file.name.Split(".")[2] + "." + $ip1
Rename-Item $file.FullName -NewName $txt
}
$sourcepath = "C:\users\xxxx\desktop\files"
$inputfiles = (Get-ChildItem -Path $sourcepath -Recurse) | Where-Object { checkfile $_ }
foreach ($inputfile in $inputfiles) {
renamefile $inputfiles
}
我遇到的问题是在上面的脚本中我使用substring(34)
从文件路径中提取日期。如果由于某种原因导致源路径发生变化(例如:H:\powershell\scripts\files
),则34
将无效。
如何从文件路径中提取正确的日期,而不管整个文件路径是什么?
答案 0 :(得分:0)
为什么不:
$sourcepath = "C:\users\xxxx\desktop\files"
Get-ChildItem -Path $sourcepath -Include "*.txt" -Recurse | % {
Rename-Item $_ "$($_.BaseName)_$($_.Directory)$($_.Extension)"
}
BaseName
是没有扩展名
Directory
是目录名称(您的日期)
Extension
是文件扩展名(即.txt
)
$(...)
用于确保正确评估...
%
是ForEach-Object
的别名,将迭代来自管道的对象。
$_
将保留ForEach
循环中的当前对象
此处,您的checkfile
功能已被-Include "*.txt"
替换。
示例:
C:\users\xxxx\desktop\files\2015-12-02\sample.txt
变为
C:\users\xxxx\desktop\files\2015-12-02\sample_2015-12-02.txt
不确定是否需要它,但如果您想从日期中删除破折号,可以使用:
Rename-Item $_ "$($_.BaseName)_$($_.Directory -replace '-','')$($_.Extension)"
编辑: OP希望删除破折号,但在文件扩展名后附加日期,所以:
$sourcepath = "C:\users\xxxx\desktop\files"
Get-ChildItem -Path $sourcepath -Include "*.txt" -Recurse | % {
Rename-Item $_ "$($_.Name).$($_.Directory.Name -replace '-', '')"
}
答案 1 :(得分:-1)
问题的细节并不完全清楚。我知道你感兴趣的日期是在完整的路径上。您想从路径中提取日期并重命名该文件,以便新文件名在最后包含该日期。
但是,您的脚本意味着路径中至少有五个句点。但我不会在任何地方看到OP中提到的内容。
所以我看到一些问题和开放项目: 1.完整路径的语法是什么?这包括五个或更多个时期 2.日期是否总是在同一目录深度?我猜xxxx代表日期。如果是,则日期是第二个子目录。日期总是在第二个子目录中吗? 3.与#2相关,是否会有包含两个或更多日期的路径?
假设我的猜测是正确的并且日期将始终是第二个子目录,那么提取日期将是:
`$dateString = $file.fullpath.split('\')[3]
如果我的一些猜测不正确,请向OP添加详细信息。如果#3为真,那么您还需要解释如何知道哪个日期是正确的使用日期。
答案 2 :(得分:-1)
您可以执行的选项只是cd
到每个路径。然后在每个目录中使用Get-ChildItem
,而不使用-Recurse
。
重命名$ip
只需$file
,不需要FullName
。
例如,定义您的功能,然后:
$sourcefile = 'Whateversourcediris'
cd $sourcefile
$directories = (Get-ChildItem)
foreach ($direct in $directories) {
cd $direct
$inputfiles = (Get-ChildItem)|where-object{checkfile $_}
foreach ($inputfile in $inputfiles) {
renamefile $inputfile
}
cd..
}
希望这有帮助。