Powershell将文件移动到特定文件夹

时间:2018-04-25 14:26:45

标签: powershell

我需要将满足特定条件的文件从文件夹A移动到文件夹B中的特定子文件夹。

条件是:

  • 对包含.exe的文件进行分组,并取两个编号最大的文件。

  • 在数字后面取前两个连字符( - )之间的字符串。自定义字符串

  • 将这些文件移到文件夹B \ win(custom-string)中,如果win文件夹不存在则创建它,自定义字符串文件夹也是如此。

因此,例如在下图中,我们将文件CICone NT Setup 0.25.5-develop-build.0.exeCICone NT Setup 0.25.5-develop-build.0.exe.blockmap移到文件夹B\win\develop\,此处开发是文件夹的名称(字符串)在两个第一个连字符之间)。 enter image description here

以下是解决方案:

$winFiles = get-childitem | Where-Object {$_.Name -like "*.exe*"} | Sort-Object -Descending -Property Name | Select-Object -First 2

ForEach ($file in $winFiles){ 
$EnvironmentSubstring = $file.Name.Split('-')[1]

if(!(Test-Path ..\B\win)){

    New-Item -Path ..\B\win -ItemType Directory -Force | Out-Null

    if(!(Test-Path ..\B\win\$EnvironmentSubstring)){
    New-Item -Path ..\B\win\$EnvironmentSubstring -ItemType Directory -Force | Out-Null
    }
}

Move-Item -Path $file.Name -Destination ..\B\win\$EnvironmentSubstring\ -Force
}

1 个答案:

答案 0 :(得分:4)

我用这些文件模拟了一个目录:

Mode                LastWriteTime         Length Name                                             
----                -------------         ------ ----                                             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.5-dev-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.4-UAT-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.3-UAT-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.3-dev-build.exe             

您的第一个请求是在此路径中找到两个编号最高的.exe文件,这很容易。

>get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

Mode                LastWriteTime         Length Name                                             
----                -------------         ------ ----                                             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.5-dev-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.4-UAT-build.exe    

下一步是将此文件列表存储在名为$files的变量中,如此。

>$files = get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

现在,迭代它们并解析出环境。

PowerShell是一种基于对象的脚本语言,它允许我们选择对象的属性(在本例中为每个文件的.Name属性),然后通过调用它们上的方法对这些属性进行操作。我们可以使用.Split()方法在字符的每个实例上打破字符串。例如,如果我们想要在- char上拆分文件,我们就可以这样做,输出如下:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe

然后我们可以使用索引表示法选择列表中的第二个,如下所示(0 =第一个位置,1 =第二个位置,依此类推)

>$file.Name.Split('-')[1]
dev

将所有这些概念融合到一个脚本中以帮助您入门:

$files = get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

ForEach ($file in $files){ 
    $EnvironmentSubstring = $file.Name.Split('-')[1]
    "this file $($file.Name) should go to .\$EnvironmentSubstring\"
}

运行它将提供以下输出:

this file CICone NT Setup 0.25.5-dev-build.exe should go to .\dev\
this file CICone NT Setup 0.25.4-UAT-build.exe should go to .\UAT\

从这里,您只需要确定用于复制文件的命令。 PowerShell使用Verb-Noun命名约定,因此我将向您提示您需要了解如何使用Copy-Item。您可以运行Get-Help Copy-Item -Examples以查看有关如何在PowerShell中使用每个cmdlet的详细示例,方法是从提示符运行它。