我是一个新手,试图在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
}}
}
答案 0 :(得分:0)
正如TesselatingHeckler已经指出Copy-Item
需要一个源对象来行动。
如果您当前的文件夹是根文件夹,则存在无限循环或重复处理的项目的危险,因此将Get.ChildItem -recurse
放入括号中。
格式表达式
'{0}{1}{2}' -f $Parent, " ", $_.Name
可以简化:
'{0} {1}' -f $Parent,$_.Name
您应该从gci中排除目录,依赖于使用gci的-File
参数或Where {!($_.PSIsContainer)} |
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