使用父目录复制和重命名文件

时间:2017-06-27 19:22:29

标签: .net powershell

我是一个新手,试图在Powershell中应用此代码,将文件复制并重命名为资源管理器上的不同文件夹,名称中包含父目录,中间添加了空格:

原始

originalfilename.txt

新名称

parentfolder originalfilename.txt

当我尝试使用以下代码时,它不起作用。我做错了什么?

$Root='C:\Users\Bart\Documents'
Get-ChildItem -Recurse | 
ForEach-Object {
$ParentOjbect = $_.Directory 
$Parent = $ParentOjbect.Name  
Copy-item -Destination (Join-Path $Root ('{0}{1}{2}' -f $Parent, " ", $_.Name)) }

非常感谢您对此有任何帮助或专业知识

更新了代码,假设变量已经实例化并且正常工作:

Get-ChildItem -Path $Source -Recurse -Force | Where-Object {$_.Name -notcontains "Archive"}| 
ForEach-Object {
    if(!$_.PSIsContainer){
    $DateStr = $_.BaseName.Substring(0,2)+'/'+$_.BaseName.Substring(3,2)+'/'+$_.BaseName.Substring(6,4)  
    $FileDate = get-date $DateStr
    If ( $FileDate -ge $Date ) {
        Copy-Item -Path (Join-Path -Path $Src -ChildPath '\*' ) -Destination (Join-Path $Dst ("$($_.Directory.Name) $($_.Name)")) -WhatIf 
          #Dst is the same as $Root
    }}
}

1 个答案:

答案 0 :(得分:0)

正如TesselatingHeckler已经指出Copy-Item需要一个源对象来行动。

如果您当前的文件夹是根文件夹,则存在无限循环或重复处理的项目的危险,因此将Get.ChildItem -recurse放入括号中。

格式表达式
'{0}{1}{2}' -f $Parent, " ", $_.Name可以简化:
'{0} {1}' -f $Parent,$_.Name

您应该从gci中排除目录,依赖于使用gci的-File参数或Where {!($_.PSIsContainer)} |

的powershell版本

Copy-item接受管道输入,因为您可以直接引用$_.Directory.Name,不需要ForEach和中间变量:

$Root = "$($Env:USERPROFILE)\Documents"
(Get-ChildItem -Recurse) | Where {!($_.PSIsContainer)} |
    Copy-Item -Dest {Join-Path $Root ("$($_.Directory.Name) $($_.Name)")} -WhatIf

如果输出看起来没问题,请删除最后一行中的-WhatIf

从我的带有树的testfolder开始:

> tree /F .
C:\TEST\2017
│   SO_16-51.ps1
├───06
│   ├───20
│   │   │   SO_44639321.cmd
│   │   │   SO_44639321.ps1
│   │   │   SYS_PURCHASES_20170617.xls
│   │   │   SYS_PURCHASES_20170618.xls
│   │   │   SYS_PURCHASES_20170619.txt
│   │   │   SYS_PURCHASES_20170619.xls
│   │   └───Destination
│   └───24
└───2017-01
    └───16
        │   get-Isocontent.ps1
        │   IsoDates.psm1
        │   IsoDateStuff.ps1
        │   Measure-IP.cmd
        │   Using-Isodates.ps1
        └───VM20
                test.csv
                test.txt

在我的空ramdisk A:\

上运行带$ root的脚本
$Root = "A:\"
(Get-ChildItem -Recurse) | Where {!($_.PSIsContainer)} |
    Copy-Item -Dest {Join-Path $Root ("$($_.Directory.Name) $($_.Name)")}

将这些结果文件提供给A:\

> tree /F A:\
A:\
    2017 SO_16-51.ps1
    20 SO_44639321.cmd
    20 SO_44639321.ps1
    20 SYS_PURCHASES_20170617.xls
    20 SYS_PURCHASES_20170618.xls
    20 SYS_PURCHASES_20170619.txt
    20 SYS_PURCHASES_20170619.xls
    16 get-Isocontent.ps1
    16 IsoDates.psm1
    16 IsoDateStuff.ps1
    16 Measure-IP.cmd
    16 Using-Isodates.ps1
    VM20 test.csv
    VM20 test.txt