Powershell 查找和移动项目
Powershell find and move items
嘿,我需要使用 powershell 脚本移动很多文件,我有点需要这方面的帮助。
根如下
> tree .
\
├───Folder1
│ ├───Sub1
│ │ └───Stockfile
│ └───Sub2
└───Folder2
├───Sub1
│ └───Stockfile
└───Sub2
脚本需要找到库存文件并将它们移动到每个主文件夹的 Sub2 文件夹中。
我制作了以下脚本来显示列表中的所有库存文件:
$var = get-childitem -Filter *stock* -recurse
foreach ($file in $var) {
write-host ($file.FullName)
}
假设文件夹都称为 sub1 和 sub2。
$var = get-childitem -Filter *stock* -recurse
foreach ($file in $var) {
$parent = Split-Path $file.fullname -parent
Move-Item $file.FullName -destination $parent\..\sub2.txt
}
我知道这不是很漂亮,但它确实有效 ;)
尝试以下操作:
Get-ChildItem -File -Recurse -Filter *_stock.csv |
Move-Item -WhatIf -Destination { $_.FullName -replace '^(.*)\Sub1\','\Sub2\' }
该方法从每个库存文件的完整路径中提取到 ...\Sub1
的路径前缀,并使 ...\Sub2
成为目标(目录)路径。
这样,股票文件从 ...\Sub1
子树中的任何位置直接移动到 ...\Sub2
。
注:
-WhatIf
向您展示了 会 首先发生的事情;删除它以执行实际移动。
假设库存文件路径仅包含[=36=]一个 Sub1
组件,并且在Sub1
子树。
-replace
将其第一个操作数解释为 正则表达式 ,这就是 \
字符的原因。必须转义为 \
才能被识别为文字;实际文件夹名称中的字符也可能需要转义(但在这种情况下不需要)。
- 如果您事先不知道文件夹名称,您可以使用
[regex]::Escape($folderName)
安全地转义它
我是这样实现的,非常感谢。
$var = get-childitem -Filter *_stock.csv -recurse
foreach ($file in $var)
{ Move-Item $file.FullName ($file.FullName -replace '^(.*)\Sub1\','\Sub2\') }
嘿,我需要使用 powershell 脚本移动很多文件,我有点需要这方面的帮助。
根如下
> tree .
\
├───Folder1
│ ├───Sub1
│ │ └───Stockfile
│ └───Sub2
└───Folder2
├───Sub1
│ └───Stockfile
└───Sub2
脚本需要找到库存文件并将它们移动到每个主文件夹的 Sub2 文件夹中。
我制作了以下脚本来显示列表中的所有库存文件:
$var = get-childitem -Filter *stock* -recurse
foreach ($file in $var) {
write-host ($file.FullName)
}
假设文件夹都称为 sub1 和 sub2。
$var = get-childitem -Filter *stock* -recurse
foreach ($file in $var) {
$parent = Split-Path $file.fullname -parent
Move-Item $file.FullName -destination $parent\..\sub2.txt
}
我知道这不是很漂亮,但它确实有效 ;)
尝试以下操作:
Get-ChildItem -File -Recurse -Filter *_stock.csv |
Move-Item -WhatIf -Destination { $_.FullName -replace '^(.*)\Sub1\','\Sub2\' }
该方法从每个库存文件的完整路径中提取到 ...\Sub1
的路径前缀,并使 ...\Sub2
成为目标(目录)路径。
这样,股票文件从 ...\Sub1
子树中的任何位置直接移动到 ...\Sub2
。
注:
-WhatIf
向您展示了 会 首先发生的事情;删除它以执行实际移动。假设库存文件路径仅包含[=36=]一个
Sub1
组件,并且在Sub1
子树。-replace
将其第一个操作数解释为 正则表达式 ,这就是\
字符的原因。必须转义为\
才能被识别为文字;实际文件夹名称中的字符也可能需要转义(但在这种情况下不需要)。- 如果您事先不知道文件夹名称,您可以使用
[regex]::Escape($folderName)
安全地转义它
- 如果您事先不知道文件夹名称,您可以使用
我是这样实现的,非常感谢。
$var = get-childitem -Filter *_stock.csv -recurse
foreach ($file in $var)
{ Move-Item $file.FullName ($file.FullName -replace '^(.*)\Sub1\','\Sub2\') }