在批处理或powershell脚本中实现Regex,以生成文件夹并按文件名中的键字符串排序移动相对文件夹中的文件

在批处理或powershell脚本中实现Regex,以生成文件夹并按文件名中的键字符串排序移动相对文件夹中的文件,powershell,batch-file,Powershell,Batch File,我使用类似的脚本生成文件并将其移动到文件夹中 $ToFolder = "$env:USERPROFILE\Desktop\to" $FromFolder = "$env:USERPROFILE\Desktop\From" #Create the sample folder on your desktop #This line can be commented out if your ToFolder exists New-Item $ToFolder -ItemType directory -

我使用类似的脚本生成文件并将其移动到文件夹中

$ToFolder = "$env:USERPROFILE\Desktop\to"
$FromFolder = "$env:USERPROFILE\Desktop\From"

#Create the sample folder on your desktop
#This line can be commented out if your ToFolder exists
New-Item $ToFolder -ItemType directory -Force

GCI -Path $FromFolder *.torrent | % {
    if ($_.Name -match "(19|20)\d{2}") {

        #Check to see if year folder already exists at the destination
        #If not then create a folder based on this year
        if (!(Test-Path "$ToFolder\$($Matches[0])")) {
            New-Item -Path "$ToFolder\$($Matches[0])" -ItemType directory
        }

        #Transfer the matching file to its new folder
        #Can be changed to Move-Item if happy with the results
        Copy-Item -Path $_.FullName -Destination "$ToFolder\$($Matches[0])" -Force
    }
}
但在我的情况下,我想移动PDF和不同的文件名,我不知道如何解决。关键是像《罗马体育报》这样的标题,没有像02-08-2016这样的后缀,也没有
-

Il_Corriere_dello_Sport_SICILIA_-_02-08-2016HQ Il_Corriere_dello_Sport_STADIO_-_02-08-2016HQ Il_Corriere_di_Arezzo_-_31-08-2016MQ Il_Giornale_Di_Vicenza_-_23-08-2016 Il_Mattino_di_Padova_-_23-08-2016 Il_Messaggero_-_02-08-2016 Il_Messaggero_-_23-08-2016 Il__Messaggero_Veneto_-_31-08-2016HQ Il__Tirreno_-_31-08-2016HQ Il_Centro_-_30-08-2016 Il_Centro_CHIETI_-_23-08-2016HQ 这是一个纯粹的解决方案——请参阅所有解释性说明(
rem
):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“SPLITCHAR=-”&rem//(用于拆分文件名的单个字符)
设置“SEARCHSTR=\\\&rem//(某个字符串将被另一个字符串替换)
设置“REPLACSTR=”&rem/(替换所有找到的搜索字符串的字符串)
设置“OVERWRITE=“&rem//(设置为非空值以强制覆盖)
rem//从命令行参数获取文件位置和模式:
设置“LOCATION=%~1”&rem//(包含要处理的文件的目录)
设置“PATTERNS=%~2”&rem//(文件模式;如果为空,则匹配所有文件)
rem/*准备覆盖标志(如果已定义,则设置为字符禁止
文件名中的rem;这会影响以后检查文件是否存在):*/
如果定义了覆盖,则设置“覆盖=|”
rem//仅在给定位置时继续:
如果定义了位置(
rem//将当前工作目录更改为给定位置:
推送“%LOCATION%”和(
rem//循环浏览与给定模式匹配的所有文件:
对于/F“eol=| delims=“%%F in('dir/B”%PATTERNS%”)do(
rem//在子程序中处理每个文件:
调用:处理“%%F”“%SPLITCHAR%”“%SEARCHSTR%”“%REPLACSTR%”
)
rem//还原以前的工作目录:
邻苯二胺
)
)
端部
退出/B
:进程
rem//检索子程序的第一个参数:
设置“文件=%~1”
rem//在(第一个)拆分名称拆分字符并在前面获取部分:
对于(“%1”)中的/F“delims=%~2”%%E,请执行以下操作(
rem//将拆分字符附加到部分名称:
设置“文件夹=%%E%~2”
)
setlocal EnableDelayedExpansion
rem//右修剪部分名称:
如果不是“%~3”==”设置“文件夹=!文件夹:%~3%~2=!”
设置“文件夹=!文件夹:%~2=!”
rem/*检查部分名称是否为空
rem(如果名称以拆分字符开头,则可能发生):*/
如果已定义文件夹(
rem//用另一个搜索字符串替换每个搜索字符串:
如果不是“%~3”==”设置“文件夹=!文件夹:%~3=%~4!”
rem//创建子目录(如果已经存在,则会出现意外错误):
2> nul md“!文件夹!”
rem/*检查目标文件是否已存在;如果覆盖标志为
rem设置为无效字符时,目标不能存在:*/
如果不存在“!文件夹!\!文件!%覆盖%”(
rem//最终移动文件(超过'1个文件已移动。'消息):
1> nul move/Y“!文件!”!文件夹!”
)
)
端部
退出/B
该脚本需要包含所有要处理的文件的目录作为第一个命令行参数。创建的子目录放在其中。可选的第二个命令行参数定义文件名模式,以过滤某些文件类型/名称。假设它保存为
D:\Script\build folder hierarchy.bat
,文件包含在
D:\Data
中,并且您只想处理
*.pdf
文件,请按如下方式运行它:

"D:\Script\build-folder-hierarchy.bat" "D:\Data" "*.pdf"
cd /D "D:\Data"
"D:\Script\build-folder-hierarchy.bat" "D:\Target" "*.pdf"

这是一种非常类似的方法,但目录处理略有不同:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“SPLITCHAR=-”&rem//(用于拆分文件名的单个字符)
设置“SEARCHSTR=\\\&rem//(某个字符串将被另一个字符串替换)
设置“REPLACSTR=”&rem/(替换所有找到的搜索字符串的字符串)
设置“OVERWRITE=“&rem//(设置为非空值以强制覆盖)
rem//从命令行参数获取文件位置和模式:
设置“LOCATION=%~1”&rem//(将处理过的文件移动到的目录)
设置“PATTERNS=%~2”&rem//(文件模式;如果为空,则匹配所有文件)
rem/*准备覆盖标志(如果已定义,则设置为字符禁止
文件名中的rem;这会影响以后检查文件是否存在):*/
如果定义了覆盖,则设置“覆盖=|”
rem//仅在给定目标位置时继续:
如果定义了位置(
rem//创建目标位置(如果已经存在,则出现意外错误):
2> nul md“%LOCATION%”
rem/*遍历与给定模式匹配的所有文件
当前工作目录中的rem:*/
对于/F“eol=| delims=“%%F in('dir/B”%PATTERNS%”)do(
rem//在子程序中处理每个文件:
调用:处理“%%F”“%LOCATION%”“%SPLITCHAR%”“%SEARCHSTR%”“%REPLACSTR%”
)
)
端部
退出/B
:进程
rem//检索子程序的第一个参数:
设置“文件=%~1”
rem//在(第一个)拆分名称拆分字符并在前面获取部分:
对于/F“delims=%~3”%%E in(“%~1”)do(
rem//将拆分字符附加到部分名称:
设置“文件夹=%%E%~3”
)
setlocal EnableDelayedExpansion
rem//右修剪部分名称:
如果不是“%~4”==”设置“文件夹=!文件夹:%~4%~3=!”
设置“文件夹=!文件夹:%~3=!”
rem/*检查部分名称是否为空
rem(如果名称以拆分字符开头,则可能发生):*/
如果已定义文件夹(
rem//用另一个搜索字符串替换每个搜索字符串:
如果不是“%~4”==”设置“文件夹=!文件夹:%~4=%~5!”
rem//创建子目录(如果已经存在,则会出现意外错误):
2> nul md“%~2\!文件夹!”
rem/*检查目标文件是否已存在;如果覆盖标志为
rem设置为无效字符时,目标不能存在:*/
如果不存在“%~2\!文件夹!\!文件!%OVERWRITE%”(
rem//最终移动文件(超过'1个文件已移动。'消息):
1> nul move/Y“!文件!”“%~2\!文件夹!”
)
)
端部
退出/B
此脚本使用当前工作目录查找要处理的文件。它需要目标目录作为第一个命令行参数,创建的子目录放在其中。可选的第二个命令行参数def
"D:\Script\build-folder-hierarchy.bat" "D:\Data" "*.pdf"
cd /D "D:\Data"
"D:\Script\build-folder-hierarchy.bat" "D:\Target" "*.pdf"