使用powershell根据文件名移动/创建文件夹/子文件夹

时间:2015-11-03 16:26:50

标签: powershell

我对powershell没有多少经验,但我有需要组织的文件。这些文件都是pdf,格式类似于“Dept123_Name_year.pdf”。

我想将文档移动到基于“Dept123”的文件夹和子文件夹“Name”。如果该文件夹尚未存在,我希望它能够创建文件夹/子文件夹。

为了更容易,我想在桌面上创建一个“Organize”文件夹并在其上运行程序。如果您认为其他方式更容易,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式匹配文件名的不同组件,然后基于此生成目录结构。 -Force mkdir参数允许您忽略目录是否已存在:

$list = ls
for ($i=0; $i -le $list.Length; $i++) {
    if ($list[$i].Name -match '([A-Za-z0-9]+)_([A-Za-z]+)_.*\.pdf') {
        $path = Join-Path $matches[1] $matches[2]
        mkdir -Force -Path $path
        cp $list[$i] "$path\."
    }
}

正则表达式部分在引号中;您可能需要对其进行修改以满足您的特定需求。请注意,圆括号中的部分对应于要提取的名称的不同部分;这些部分按顺序加载到$matches变量中,该变量是自动生成的。例如。 '([A-Za-z0-9]+)\.txt'将匹配名称中只包含字母或数字的任何文本文件,并将实际名称 - 减去扩展名 - 粘贴到$matches[1]

答案 1 :(得分:0)

使用正则表达式和完整格式的Powershell:

# using ?<name> within a () block in regex causes powershell to 'name' the property 
# with the given name within the automatic variable, $matches, object.
$Pattern = "(?<Dept>.*)_(?<Name>.*)_(?<Year>.*)\.pdf"

# Get a list of all items in the current location.  The location should be set using
# set-location, or specified to the command by adding -Path $location
$list = Get-ChildItem

# Foreach-Object loop based on the list of files
foreach ($file in $list) {
    # send $true/$false results from -matches operation to $null
    $File.Name -matches $Pattern 2> $Null

    # build destination path from the results of the regex match operation above
    $Destination = Join-Path $matches.Dept $matches.Name

    # Create the destination if it does not exist
    if (!(Test-Path $Destination) ) { 
        New-Item -ItemType Directory -Path $destination 
    }

    # Copy the file, keeping only the year part of the name
    Copy-Item $file "$destination\$($matches.year)"+".pdf"
}