Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell查找和移动项目_Powershell_Find_Move - Fatal编程技术网

Powershell查找和移动项目

Powershell查找和移动项目,powershell,find,move,Powershell,Find,Move,嘿,我需要使用powershell脚本移动很多文件,我需要这方面的帮助 根目录如下所示 > tree . \ ├───Folder1 │ ├───Sub1 │ │ └───Stockfile │ └───Sub2 └───Folder2 ├───Sub1 │ └───Stockfile └───Sub2 脚本需要找到StockFile并将其移动到每个Main文件夹的Sub2文件夹中 我制作了以下脚本来显示列表中的所有StockFile: $va

嘿,我需要使用powershell脚本移动很多文件,我需要这方面的帮助

根目录如下所示

> tree .
\
├───Folder1
│   ├───Sub1
│   │   └───Stockfile
│   └───Sub2
└───Folder2
    ├───Sub1
    │   └───Stockfile
    └───Sub2
脚本需要找到StockFile并将其移动到每个Main文件夹的Sub2文件夹中

我制作了以下脚本来显示列表中的所有StockFile:

$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\1.txt
}
我知道这并不漂亮,但它很管用;)

尝试以下操作:

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)

    • 我这样做了,非常感谢

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

      Sub2
      文件夹的名称是否一致?您如何“知道”目标文件夹的名称?它是否总是显式命名为
      Sub2
      ?文件夹不是命名为Sub1和Sub2。大约有400个文件夹,从TM开始,然后是6个随机数OK我删除了-WhatIf,因为它似乎有效。但是如果没有-WhatIf语句,我会得到以下消息:Move Item:找不到路径的一部分。[Move Item],DirectoryNotFoundException+FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommandOk现在可以工作了,下一个挑战是从以TM*开头的文件夹中移动文件。因此,文件夹名称类似于TM123456、TM456789等等。这些文件夹中有两个子文件夹。如何从以TM开头的文件夹中移动文件?我刚刚意识到,使用ScriptBlock参数,完全不需要循环或ForEach对象就可以完成此操作-请查看我的更新。至于后续问题,请将其作为一个新问题发布(完成此操作后,请随时通知我).这就是我提出的解决方案,鉴于我的答案更为简洁,并提供了解释,请接受我的答案并删除此答案。请允许我向新来者提供标准建议。如果答案解决了您的问题,请单击大复选标记接受答案(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请参阅。