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

Powershell将文件移动到特定文件夹,powershell,Powershell,我需要将满足特定条件的文件从文件夹A移动到文件夹B中的特定子文件夹 条件是: 对包含.exe的文件进行分组,并取两个最大的文件 在数字之后,取前两个连字符(-)之间的字符串。自定义字符串 将这些文件移动到文件夹B\win(自定义字符串)中,如果win文件夹不存在,请创建它,自定义字符串文件夹也是如此 例如,在下图中,我们将文件CICone NT Setup 0.25.5-develope-build.0.exe和CICone NT Setup 0.25.5-develope-build.0.

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

条件是:

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

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

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

例如,在下图中,我们将文件
CICone NT Setup 0.25.5-develope-build.0.exe
CICone NT Setup 0.25.5-develope-build.0.exe.blockmap
移动到文件夹
B\win\develope\
,这里develope是文件夹的名称(前两个连字符之间的字符串)。


以下是解决方案:

$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
}

我用以下文件模拟了一个目录:

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()
方法在字符的每个实例上分解字符串。例如,如果我们想在
-
字符上拆分文件,我们可以这样做,输出如下:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe
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\
然后,我们可以使用如下索引符号选择列表中的第二个位置(0=第一个位置,1=第二个位置,依此类推)

将所有这些概念烘焙到一个脚本中,让您开始:

$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\"
}
运行将产生以下输出:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe
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使用
动词-名词
命名约定,因此我将提示您需要学习如何使用
复制项
。您可以运行
Get Help Copy Item-Examples
,通过在提示符下运行来查看有关如何在PowerShell中使用每个cmdlet的详细示例。

我用以下文件模拟了一个目录:

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()
方法在字符的每个实例上分解字符串。例如,如果我们想在
-
字符上拆分文件,我们可以这样做,输出如下:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe
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\
然后,我们可以使用如下索引符号选择列表中的第二个位置(0=第一个位置,1=第二个位置,依此类推)

将所有这些概念烘焙到一个脚本中,让您开始:

$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\"
}
运行将产生以下输出:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe
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使用
动词-名词
命名约定,因此我将提示您需要学习如何使用
复制项
。您可以运行
Get Help Copy Item-Examples
以查看有关如何在PowerShell中使用每个cmdlet的详细示例,方法是从提示符处运行该cmdlet。

您尝试了什么,以及尝试了什么失败了?理想情况下,您应该提供您尝试过的内容的详细信息,并包括关于失败原因的具体信息,以及错误消息和/或错误输出。不是代码编写服务;最好的问题是那些提供有用信息的问题,这样那些回答问题的人可以引导你设计出自己的正确答案。请参阅一个好问题。stackoverflow不是脚本编写服务。我们在这里帮助您解决您在编写代码时遇到的特定离散问题。您编写的代码有什么具体问题?@JeffZeitlin当我回家后,我会提供一个我正在编写的代码。它并没有失败,但由于我不熟悉脚本语言,所以它并不完整。但是如果我在有人提供帮助之前提出了一个解决方案,我当然会在这里写下我的解决方案?理想情况下,您应该提供您尝试过的内容的详细信息,并包括关于失败原因的具体信息,以及错误消息和/或错误输出。不是代码编写服务;最好的问题是那些提供有用信息的问题,这样那些回答问题的人可以引导你设计出自己的正确答案。请参阅一个好问题。stackoverflow不是脚本编写服务。我们在这里帮助您解决您在编写代码时遇到的特定离散问题。您编写的代码有什么具体问题?@JeffZeitlin当我回家后,我会提供一个我正在编写的代码。它并没有失败,但由于我不熟悉脚本语言,所以它并不完整。但是如果我在别人提供帮助之前提出了一个解决方案,我当然会在这里写下我的解决方案。回答得好。当subversion中的位置数发生变化时,版本号排序变得很困难,即
0.25.9
-->
0.25.10
True,要处理这个问题,他可能需要严格的编号,例如0.25.09。很难,并非不可能。是一种描述的排序方法,将所有数字扩展为固定长度,并动态使用前导零。非常有趣,谢谢。