我需要将满足特定条件的文件从文件夹A移动到文件夹B中的特定子文件夹。
条件是:
对包含.exe的文件进行分组,并取两个编号最大的文件。
在数字后面取前两个连字符( - )之间的字符串。自定义字符串
将这些文件移到文件夹B \ win(custom-string)中,如果win文件夹不存在则创建它,自定义字符串文件夹也是如此。
因此,例如在下图中,我们将文件CICone NT Setup 0.25.5-develop-build.0.exe
和CICone NT Setup 0.25.5-develop-build.0.exe.blockmap
移到文件夹B\win\develop\
,此处开发是文件夹的名称(字符串)在两个第一个连字符之间)。
以下是解决方案:
$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
}
答案 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的详细示例,方法是从提示符运行它。