我试图通过尝试根据文件名

时间:2018-04-04 01:58:19

标签: regex powershell split

我目前有一个powershell脚本,我根据文件名将文件移动到特定文件夹。脚本的顶部首先设置一组特定文件应该到达的目标路径的变量:

$FileName = "path to where files with that name go"

然后我将整个文件目录的内容递归地读入变量:

$Files = Get-ChildItem $FileFolder -File -Recurse

然后我有一堆相同的命令用于匹配和移动:

$Files | Where-Object { $_.Name -match 'some name' } | Move-Item -Destination "$Variable-set-above" -Force

当它是10或20个匹配时很好,但随着越来越多的文件被添加并需要组织,我想看看我是否可以通过基于它构建目标文件夹结构来清理脚本文件名,而不是每个匹配案例都有一行,每行都有一行。

我正在研究Split-Path,正则表达式-splitString.split()以及其他一些选项,我认为我已经接近了,但我无法找到例如,有人拿到文件名的第一部分,最多一两个字符,保留第一部分,排除其余部分。有点像Split-Ignoresecond或类似的东西。

我在修改主脚本之前先测试了这一点,到目前为止我已经这样做了:

名为Test.One.File.D0001.txtTest.Two.File.D0001.txtTest.Three.File.D0001.txt的文件夹中的3个文件。

我的测试脚本:

$Testfiles = Get-ChildItem -Name *.txt
$Testfiles.replace('.',' ') -split "D0"

这给了我一个输出:

Test One File
001 txt
Test Three File
001 txt
Test Two File
001 txt

奇怪的是,它的顺序并不正确,但我想我一次只处理1个文件,这样才能解决问题。< / p>

我想要做的是用文件名读取,忽略&#34; 001 txt&#34;部分,使用文件名的第一部分来构建文件移动的目标路径的最后一部分,然后将文件移动到该目标。我可以使用Split-Path -Leafbase,但我无法弄清楚它的语法不会给我一个错误,而且我仍然留下我不想要的部分文件名。

假设我有一个名为One.Two.ThreeD0001的文件,需要转到D:\Files\Onestwosthrees。我希望我的脚本读取文件夹中的文件,然后处理文件One.Two.ThreeD0001.txt,以便剩下的所有内容都是&#34; One Two Three&#34;,将其粘贴在一个变量中$SplitFile,然后将文件移至根据D:\Files\Onestwosthrees\$SplitFile等文件名构建的文件夹。

我想进行进一步的解析,但是如果我可以将这部分放下来,我可以找出我需要的子解析。

到目前为止我查看的一些消息来源是:

https://superuser.com/questions/817955

https://kevinmarquette.github.io/2017-07-31-Powershell-regex-regular-expression/

1 个答案:

答案 0 :(得分:0)

认为你几乎就在那里:

cd "C:\Users\users\Downloads\StackTesting"

$testFiles = Get-Childitem -Include *.txt

foreach ( $item in $testfiles ) {
    $directory = ($item.name.replace('.', '') -split "D0")[0]

    ## check if folder exists, if not create
    if (!(Test-Path "C:\Users\user\Downloads\StackTesting\$directory")) 
    { 
       New-Item -Type Directory "C:\Users\users\Downloads\StackTesting\$directory"
    }
    ELSE
    {
        Write-Host "Folder exists"
    }

    ## Move item to folder
   Move-item $item.fullname -Destination "C:\Users\users\Downloads\StackTesting\$directory"

}

这就是我获取目录名称的方式:

$directory = ($item.name.replace('.', '') -split "D0")[0]

从空格更改为无空格,因为底部的示例没有空格。