重命名并复制嵌套目录Powershell中的选择文件

时间:2017-06-28 13:49:48

标签: powershell

我似乎无法重命名,更不用说使用此代码复制任何文本文件了,我试图通过一个嵌套目录,应该使用Get-ChildItem -Recurse来处理。

似乎我只浏览所选源文件夹的文件,而不是通过所有子文件夹完全递归。

目录中的示例文本文件为02-01-2016 Test.txt

$InputDate = Read-Host -Param 'Please select a starting date (In the following format: mmddyyyy)'
$Date = [datetime]::ParseExact($InputDate, "MMddyyyy", [Globalization.CultureInfo]::CreateSpecificCulture('en-US'), $null)
$Dst = Select-FolderDialog #This function is working for me, assume you can select a folder
$Src = 'C:\Users\Bart Zhang\Downloads\Test Folder (1)\Test Folder' # #source
$FileType = '*.txt'

Get-ChildItem -Path $Src -Recurse -Force | Where-Object {$_.Name -notcontains "Archive"} | ForEach-Object {
    $DateStr = $_.BaseName.Substring(0, 2) + $_.BaseName.Substring(3, 2) + $_.BaseName.Substring(6, 4)  
    $FileDate = [datetime]::ParseExact($DateStr, "MMddyyyy", [Globalization.CultureInfo]::CreateSpecificCulture('en-US'), $null) 
    If ( $FileDate -ge $Date ) {
        Rename-Item -NewName { $_.Directory.Name + ' ' + $_.Name} -Filter $FileType -Recurse -Force
        Copy-Item -Path (Join-Path -Path $Src -ChildPath '\*' ) -Destination $Dst -Filter $FileType -Recurse -Force
    }
}

1 个答案:

答案 0 :(得分:1)

我开始使用包含此命名标准的文件的示例文件夹,与您描述的内容相匹配。 enter image description here

然后我浏览了你的日期转换逻辑,发现它似乎没有按照描述的那样工作(例如,很多错误试图转移到#0; 04082011'所以我做了第10行的更改,将行更改为:

$DateStr = $_.BaseName.Substring(0,2)+'/'+$_.BaseName.Substring(3,2)+'/'+$_.BaseName.Substring(6,4)

我只是在日期中添加了斜线,因此我们最终会在2011年04月08日结束时使用' 04/08/20'这似乎是$DateStr填充所需的全部内容,然后允许文件日期比较行工作。我还将第11行的转换更改为此

$FileDate = get-date $DateStr

为了可见性添加一些Write-Host行,我就明白了。

03/02/2017 03-02-2017 Test has date of 03/02/2017 00:00:00
03-02-2017 Test has a file date of 03/02/2017 00:00:00 which is newer than 02/04/2014 10:13:14, time to move it
03/22/2010 03-22-2010 Test has date of 03/22/2010 00:00:00
03-22-2010 Test has a file date of 03/22/2010 00:00:00 which is older than 02/04/2014 10:13:14, ignoring...
04/08/2011 04-08-2011 Test has date of 04/08/2011 00:00:00
04-08-2011 Test has a file date of 04/08/2011 00:00:00 which is older than 02/04/2014 10:13:14, ignoring...
05/08/2016 05-08-2016 Test has date of 05/08/2016 00:00:00
05-08-2016 Test has a file date of 05/08/2016 00:00:00 which is newer than 02/04/2014 10:13:14, time to move it

我还没有检查过你的其余代码,但这会让你重回正轨。

结论

从像这样的文件名解析文件日期的工作很好,这很棘手。然而,您尝试的转换技术使得事情变得比实际需要的更难,因此通过更改我们解析文件名的方式(添加斜杠以便PowerShell可以使用更简单的Get-Date cmdlet识别字符串),我们可以使用更容易理解的不同技术。