我想将特定文件类型的所有文件移动到其现有结构中的子文件夹中。我能找到的所有例子都有硬编码的子文件夹。我有许多冗余文件夹结构,所以硬编码不是一个选项。
我试过这个:
$Dir = "\\root\*\REPORTS\*"
Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"} | Move-Item -dest .\Queue\
产生此错误:
- Get-ChildItem $ Dir | Where-Object {$ _。名称-match" csv"} | Move-Item<<<< -dest。\ Queue \
- CategoryInfo:WriteError:(\ root ... ity20170823.csv:FileInfo)[Move-Item],IOException
- FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
我已经读过句号表示当前文件夹,因此我尝试将其用于目的地,但它似乎只适用于路径。它找到文件正常,但无法移动它们。救命啊!
修改 我根据以下建议尝试了这个:
$Dir = "\\root\*\REPORTS\*"
Get-ChildItem $Dir | Where-Object {$_.Name -match "xml"} | %{
#Move-Item -path $_.FullName -dest $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
write-output $_.FullName
write-output $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
}
写入输出值看起来不错,但move-item行产生此错误:
啊,因为路径不存在。如果我放入if-folder-exists-else-create检查,这将有效。我相信。Move-Item:找不到路径的一部分。在 C:\ Users [me] \ Desktop [filename] .ps1:18 char:14 + Move-Item<<<< -path $ .FullName -dest $ .FullName.Replace(' REPORTS',' REPORTS \ Queue') + CategoryInfo:WriteError:(\ root \ d $ ... ity20170823.csv:FileInfo)[Move-Item], DirectoryNotFoundException + FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
编辑2 这是有效的,除了它将所有文件放入为文件命名的目录。
$Dir = "\\root\*\REPORTS\*"
Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"} | %{
New-Item -ItemType Directory -Force -Path $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
Move-Item -path $_.FullName -dest $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
#write-output $_.FullName
#write-output $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
}
结果转移到:
\\root\abc\REPORTS\Queue\20170707-resub.csv\20170707-resub.csv
如果创建的文件夹只是路径而不是文件,那就太好了。
答案 0 :(得分:1)
此解决方案应根据评论(更快)完成您想要的任务:
$Dir = '\\root\*\REPORTS\*'
Get-ChildItem -Path $Dir -File -Filter '*.csv' |
ForEach-Object {
$Dest = "$($_.DirectoryName)\Queue"
If (!(Test-Path -LiteralPath $Dest))
{New-Item -Path $Dest -ItemType 'Directory' -Force}
Move-Item -Path $_.FullName -Destination $Dest
}
答案 1 :(得分:0)
您在Move-item cmdlet中缺少-path
,其中PS应该读取您正在移动的内容。这就是为什么你可能会收到这个错误。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/move-item?view=powershell-5.1
我假设你想循环遍历所有文件。我会这样做......
$dir = "\\root\*\REPORTS\*"
Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"}| %{
Move-Item -path $_.FullName -dest "$Dir\Queue\$($_.Name)"
}
我不建议使用-match
因为它可以在文件名中的任何位置选取csv
,除非您确定要在名称中的任何位置放置csv
的所有文件。 / p>
答案 2 :(得分:0)
你需要一个两步的方法,首先迭代文件夹,然后重复文件 移动不会创建新的文件夹,你要检查自己。
$Dir = "\\root\*\REPORTS"
Get-ChildItem -Path $Dir | Where-Object {$_.PSIsContainer | ForEach-Object {
$Destination = Join-Path $_.FullName 'Queue\'
If (!(Test-Path $Destination)){MD $Destination|Out-Null}
Move-Item "$($_.FullName)\*.csv" -Destination $Destination -WhatIf
}
检查文件夹是否已创建,输出是否正常删除/注释掉-WhatIf
答案 3 :(得分:0)
如果需要在文件夹中查找代码,请在每个文件夹中创建一个新的子文件夹,然后将文件从每个文件夹移动到新的子文件夹。我删除了文件过滤器,因为我不需要它。 (我使用了来自TheIncorrigible1的代码,并感谢Pawtuxet进行了代码更改) 希望我能通过发布规则来遵守规则,以便其他人可以将修改后的版本用于子文件夹。
<#
Before:
c:\foldertest
folder1
fil
fil
folder2
fil
fil
folder3
fil
fil
----->
After:
c:\foldertest
folder1
subfolder
fil
fil
folder2
Subfolder
fil
fil
folder3
Subfolder
fil
fil
#>
$Dir = 'C:\temp\pstest\target\*'
Foreach ($folder in Get-ChildItem -Path $Dir -Directory) {
Foreach ($file in Get-ChildItem -Path $folder -File) {
$Dest = "$folder\Subfolder"
If (!(Test-Path -LiteralPath $Dest)) {
New-Item -Path $Dest -ItemType 'Directory' -Force
}
Move-Item -Path $file.FullName -Destination $Dest
}
}