2015-12-31 39 views
2

初学者和我卡住了。将具有相同名称的文件移动到匹配的命名文件夹

$filter= "Alive" 
$source="D:\Users\Heather's\VendorScans\*" 

Get-ChildItem -recurse | ?{ $_.PSIsContainer } |Select-Object fullname | Where-Object {$_.fullname -match $filter} 
$destination= (Where-Object {$_.fullname -match $filter}) 

Copy-Item $source -destination $destination -recurse 

最初的问题是将名称为“Alive”的文件移动到名为“Alive”的文件夹中。 所以我试图从一个目录文件夹中的子文件夹复制文件,我将它移动到同一个驱动器上的双嵌套子文件夹。所以D:\Users\Heather's\VendorScans\*D:\Users\Heather's\Vendors\AliveHospice。等目的地将根据文件名是否匹配而改变。唯一的问题是,当我运行这个时,它将文件放在主目录中,所以D:\Users\Heather's而不是去全名路径。如果有人能够将我联系到一些有用的资源,或者将我推向正确的方向,我将不胜感激。仍然不知道如何访问子文件夹或创建独特的目的地。我需要一个循环吗?

+1

的'GET-ChildItem'行通过管道进行了大量过滤,但最终的结果并未保存,它离开管道,并且可能只是打印到屏幕上。 ('PSIsContainer'意味着它只包含文件夹,但是你讨论想要文件?)。下一行'$ destination = ...'调用'没有输入的where-object',并保存空输出 - 所以'Copy-Item'的目的地是空的。你可能确实需要一个或两个循环,但我并不真正了解你在做什么 - 你能举一个例子说明哪个文件可能从哪里移动到哪里?目标文件名如何改变? – TessellatingHeckler

+1

目标文件夹名称/位置是否已知?这是一条固定的路径吗?相对于文件或源文件夹?一个完全任意的位置? –

+0

来源始终是相同的(vendorscans文件夹),并且目的地与我选择的过滤器有关。 (在我的最终版本中,我会得到类似于($ filter = Read-Host“请输入过滤器名称”)的脚本。脚本应读取文件名并将文件移动或复制到同一D驱动器上的文件夹(可能是子文件夹)同样的名字,也感谢你对Get-Childitem的解释,我想我可以将它的结果保存到一个变量中! – Heather

回答

1

如果我有很好的理解你愿意做的,这里是对应的代码:

$filter= "Alive" 
$source="D:\Users\Heather's\VendorScans" 
$destination ="D:\Users\Heather's\VendorScans" 
set-location $source 

$source_regex = [regex]::escape($source) 
(Get-ChildItem $source -recurse | where {-not ($_.psiscontainer)} | select -expand fullname) -match $filter | 
     foreach { 
      $file_name = ($_ | split-path -leaf) 
      $file_name_withoutextension = [System.IO.Path]::GetFileNameWithoutExtension($file_name) 
      $file_destination = $destination + '\' + $file_name_withoutextension 
      $file_dest = ($_ | split-path -parent) -replace $source_regex,$file_destination 

      if (-not (test-path $file_dest)){mkdir $file_dest} 
      copy-item $_ -Destination $file_dest 
     } 

希望这有助于 新年 问候 斯特凡

+0

谢谢!这是否将文件放入不同的文件夹或相同?:O – Heather

+0

IT WORKSSSS !! !你真了不起,谢谢。 – Heather

相关问题