2016-11-10 17 views
1

嘿,我需要移动很多文件使用PowerShell脚本,我需要在这一个帮助。Powershell找到并移动项目

根是如下

> tree . 
\ 
├───Folder1 
│ ├───Sub1 
│ │ └───Stockfile 
│ └───Sub2 
└───Folder2 
    ├───Sub1 
    │ └───Stockfile 
    └───Sub2 

脚本需要找到stockfiles,并需要将它们移动到每个mainfolder的分公司2文件夹。

我做了下面的脚本来显示所有的stockfiles在一个列表:

$var = get-childitem -Filter *stock* -recurse 
foreach ($file in $var) { 
write-host ($file.FullName) 
} 
+2

'Sub2'文件夹的名称是否一致?你如何“知道”目标文件夹的名称?它总是明确命名为'Sub2'吗? – gravity

+0

这些文件夹未被命名为Sub1和Sub2。有像400开始TM和然后6个随机数的文件夹 –

回答

1

尝试以下操作:

Get-ChildItem -File -Recurse -Filter *_stock.csv | 
    Move-Item -WhatIf -Destination { $_.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\' } 

该方法从每只股票的完整路径提取路径前缀高达...\Sub1文件并使...\Sub2为目标(目录)路径。

这样,股票文件将从...\Sub1子树中的任何位置直接移动到...\Sub2

注:

  • -WhatIf向您展示了发生第一;删除它以执行实际移动。

  • 的假设是,该股文件路径只包含一个Sub1组成部分,不存在库存的文件与在Sub1子树重名。

  • -replace解释其第一个操作数为正则表达式,这就是为什么\字符。必须以\\的格式转义才能被识别为文字;实际文件夹名称中的字符也可能需要转义(但在此情况下不需要)。

    • 如果你不事先知道该文件夹的名称,你可以放心地与[regex]::Escape($folderName)
+0

好吧,我删除了-WhatIf,因为它似乎工作。但是如果没有-WhatIf语句,我会收到以下消息: –

+0

Move-Item:找不到路径的一部分。 [Move-Item],DirectoryNotFoundException + FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand –

+0

确定它现在可以工作,下一个挑战是从以TM *开头的文件夹中移动文件。所以文件夹名称就像TM123456,TM456789等等。在这些文件夹中是2个子文件夹。如何从以TM开头的文件夹移动文件? –

1

假设文件夹都称为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\1.txt 
} 

我知道这是不是很漂亮,但它的工作原理;)

0

我做到了以这种方式工作,非常感谢逃脱它。

$var = get-childitem -Filter *_stock.csv -recurse 
foreach ($file in $var) 
{ Move-Item $file.FullName ($file.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\') } 
+1

这实际上是我提出的解决方案,并且考虑到我的答案更简洁并提供了解释,请接受我的答案并删除此答案。请允许我向新人提供标准建议。如果答案能够解决您的问题,请点击旁边的大号复选标记(✓)并选择性地对其进行投票表决(投票需要至少15个声望点)才能接受答案。 如果您发现其他答案有帮助,请投票给他们。接受和投票有助于未来的读者。请参阅[相关帮助中心文章](http://stackoverflow.com/help/someone-answers)。 – mklement0