使用Powershell将文档移动到基于文件名

时间:2017-05-05 04:03:53

标签: powershell

我在你的数据库中搜索了答案并找到了相似的东西,但并不是我需要的东西。我不知道如何编写足够好的代码来获取一些示例并修改它们以满足我的需求。

我有文档需要移动到与文档名称开头同名的文件夹。以下是我的文档名称的几个示例(ParcelNum_CountyNum_Year_DocType.pdf)

  • 188777_014_2013_NOAV.pdf
  • 242353_227_2014_HRGNOTICE.pdf
  • R506275_246_2013_NOAV.pdf

我目前拥有的文件位于由县号命名的单个文件夹中(第一个_和第二个_之间的3位数字)

我创建了由ParcelNum命名的文件夹,这是第一组_中的第一组字符/数字。我需要Powershell来读取第一个_时停止的文档名称的第一部分,并将其放在与该numchar匹配的文件夹中。 例如,上面的第一个文档示例名为188777_014_2013_NOAV.pdf,位于名为014的CountyNum文件夹的根目录下。 对于该示例,我需要将其从根文件夹014移动到名为188777的子文件夹中。

我希望这是有道理的。请随时提问。

谢谢,

2 个答案:

答案 0 :(得分:3)

这就是我要做的。这是假设您要移动的文件位于父文件夹和根&要对其进行排序的子文件夹也位于同一文件夹中,即如果示例PDF的路径为C:\test\Docs\188777_014_2013_NOAV.pdf,并且您希望它最终位于C:\test\Docs\014\188777

根据您的喜好更新$ basePath变量中的路径。每个步骤都包含注释并附有说明。享受!

# This is the parent directory for the files and sorted folders
$basePath = "C:\test\Docs"

# This sets that folder as your CWD (Current working directory)
Set-Location $basePath

# This grabs the *files* underneath the parent directory, ignoring sub directories
$files = Get-ChildItem $basePath | Where-Object {$_.PSIsContainer -eq $false}

# Starts iterating through each file
foreach ($file in $files) {
    # Split the base file name by underscore (creates an array with each part of the name seperated)
    $split = $file.BaseName -split "_"
    # Store the second item [1] in the array $split as the root folder name
    $root = "$basePath\$($split[1])"
    # Store the first item [0] in the array $split as the sub folder name
    $sub = "$root\$($split[0])"

    # Check if the root folder exists, create it if not
    if (!(Test-Path $root -ErrorAction SilentlyContinue)) {
        New-Item $root -ItemType Directory | Out-Null
    }

    # Check if the sub folder exists, create it if not
    if (!(Test-Path $sub -ErrorAction SilentlyContinue)) {
        New-Item $sub -ItemType Directory | Out-Null
    }

    # Move the file to the sub folder
    Move-Item $file.FullName -Destination $sub -Verbose
}

答案 1 :(得分:1)

试图解决你的问题:

#Requires -Version 4.0

function Move-FileToDirectoryWithSamePrefix
{
  [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateScript( {Test-Path $_ -PathType Container})] 
        [string]
        $DirectoryToMoveFileTo,

        
        [Parameter(Mandatory = $true, Position = 1)]
        [ValidateScript( {Test-Path $_ -PathType Container})] 
        [string]
        $DirectoryToSearchFiles
        )

        Begin {
           # Needed to find all files for movement
           $fileRegex = ".*_[0-9]{3}_[0-9]{4}_.*\.pdf"
           $currentLocation = Get-Location
        }
        Process{

           # find files to move
           $matchingFile = Get-ChildItem -Path $DirectoryToSearchFiles -Recurse | Where-Object { $_.Name -match $fileRegex }

           # Change to destination directory
           Set-Location $DirectoryToMoveFileTo

           foreach ($file in $matchingFile) {
                $directoryName = ($file -split "_")[0]

                # Find the director to move to
                $dirToMoveFile = Get-ChildItem -Recurse -Include $directoryName

                if ($dirToMoveFile -eq $null) {
                    # Create directory if not existing
                    $dirToMoveFile =  New-Item -Name $directoryName -Path $DirectoryToMoveFileTo -ItemType Directory
                }

                Move-Item -Path $file.FullName -Destination $dirToMoveFile.fullName
           }
        }
        End{
            Set-Location $currentLocation
        }
}

将上方存储在ps1文件中,例如moveFile.ps1。然后打开PowerShell并获取文件:

PS C:\> . C:\PathToYourPs1File\moveFile.ps1

之后您可以使用以下功能:

PS C:\temp> Move-FileToDirectoryWithSamePrefix -DirectoryToMoveFileTo .\filesDestination -DirectoryToSearchFiles .\files

如果需要调试它,请在Powershell ISE中打开ps1,设置断点并启动脚本。有关详细信息,请参阅此link

希望有所帮助。