Powershell将文件移动到特定文件夹
我需要将满足特定条件的文件从文件夹A移动到文件夹B中的特定子文件夹 条件是: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.
- 对包含.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。很难,并非不可能。是一种描述的排序方法,将所有数字扩展为固定长度,并动态使用前导零。非常有趣,谢谢。