我对powershell没有多少经验,但我有需要组织的文件。这些文件都是pdf,格式类似于“Dept123_Name_year.pdf”。
我想将文档移动到基于“Dept123”的文件夹和子文件夹“Name”。如果该文件夹尚未存在,我希望它能够创建文件夹/子文件夹。
为了更容易,我想在桌面上创建一个“Organize”文件夹并在其上运行程序。如果您认为其他方式更容易,请告诉我。
提前致谢。
答案 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"
}