我有一个文件夹(没有子文件夹),里面有成千上万种不同格式的文件(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
}
}
}
答案 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"
}
}
$file.Name -match 'PN([5-9]\d{5})'
这样做的目的是查找包含PN的文件,后跟5到9之间的任意数字,然后再输入5个数字。这应该照顾500000-999999标准。 Move-Item
两次。而只是检查路径。如果不是(!)那么就创建文件夹。