从powershell中的路径中提取日期

时间:2015-12-06 02:31:26

标签: powershell

我有一个名为files的文件夹,其路径如下:C:\users\xxxx\desktop\files

在此文件夹中有不同的文件夹:2015-12-022015-12-012015-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将无效。

如何从文件路径中提取正确的日期,而不管整个文件路径是什么?

3 个答案:

答案 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..
}

希望这有帮助。