根据powershell中的文件名将文件移动到新位置

时间:2014-11-26 01:53:45

标签: regex debugging powershell

我有一个文件夹(没有子文件夹),里面有成千上万种不同格式的文件(pdf,xls,jpeg等)。 这些文件没有共同的命名结构,唯一的模式是它们在文件名中的某个地方有字母PN,后面跟着一个6位数字。 PNxxxxxx代码可能出现在文件名中的任何一点,包括起点,终点,空格或其他字符。

多个文件可以共享相同的PN代码,例如,pdf,xls和jpeg的标题中都可能包含PN854678。

我已经为powershell编写了一个脚本,试图将所有文件移动到一个新位置,在那里它们将被放入一个文件夹(可能存在或者可能不存在)以及可能共享相同代码的任何其他文件。该文件夹是PN,后跟正确的6位数字。

当我尝试运行我的脚本时,没有任何反应,我没有任何错误或任何错误。我认为代码执行,源文件夹和目标文件夹不变。为了确认,我使用了set-executionpolicy remotesigned并尝试使用cmd.exe运行脚本。

这是代码,请记住,这是我第一次尝试使用PowerShell,而且我是一般的新脚本,所以如果我犯了任何愚蠢的错误,我会道歉。

# Set source directory to working copy
$sourceFolder = "C:\Location A"

#Set target directory where the organized folders will be created
$targetFolder = "C:\Location B"

$fileList = Get-Childitem -Path $sourceFolder
foreach($file in $fileList)
{
    if($file.Name -eq "*PN[500000-999999]*") #Numbers are only in range from 500000 to 999999
    {

        #Extract relevant part of $file.Name using regex pattern -match 
        #and store as [string]$folderName

    $pattern = 'PN\d{6}'

        if($file.Name -match $pattern)
        {        
            [string]$folderName = $matches[0]        
        }


    #Now move file to appropriate folder

    #Check if a folder already exists with the name currently contained in $folderName
        if(Test-Path C:\Location B\$folderName) 
        {
            #Folder already exists, move $file to the folder given by $folderName
            Move-Item C:\Location A\$file C:\Location B\$folderName                  
        }
            else
        {
            #Relevant folder does not yet exist. Create folder and move $file to created folder
            New-Item C:\Location B\$folderName -type directory
            Move-Item C:\Location A\$file C:\Location B\$folderName
        }

    }
} 

1 个答案:

答案 0 :(得分:3)

您的文件是存在于一个文件夹还是一系列子文件夹中?您没有提及它,但请记住,-recurse上需要Get-Childitem才能从子文件夹中获取结果。 您的问题来源是此条款$file.Name -eq "*PN[500000-999999]*"-eq并不意味着处理wlidcards。我会建议这个简单的替代

$file.Name -match 'PN\d{6}'

但是您指定该数字需要在一定范围内。让我们稍微更新一下。

# Set source directory to working copy
$sourceFolder = "C:\Location A"

#Set target directory where the organized folders will be created
$targetFolder = "C:\Location B"

foreach($file in $fileList)
{
    # Find a file with a valid PN Number
    If($file.Name -match 'PN[5-9]\d{5}'){
        # Capture the match for simplicity sake
        $folderName = $matches[0]

        #Check if a folder already exists with the name currently contained in $folderName
        if(!(Test-Path "C:\Location B\$folderName")){New-Item "C:\Location B\$folderName" -type directory} 

        #Folder already exists, move $file to the folder given by $folderName
        Move-Item "C:\Location A\$file" "C:\Location B\$folderName"                  
    }

}
  1. 别忘了引用你的字符串。您可以将变量放在双引号字符串中,它们将适当扩展。
  2. $file.Name -match 'PN([5-9]\d{5})'这样做的目的是查找包含PN的文件,后跟5到9之间的任意数字,然后再输入5个数字。这应该照顾500000-999999标准。
  3. 无论如何,你还要移动文件。没有意义,使用Move-Item两次。而只是检查路径。如果不是(!)那么就创建文件夹。