PowerShell:替换字符串中的字符时出现代码错误

wsxa1bj1  于 2023-05-29  发布在  Shell
关注(0)|答案(3)|浏览(192)

我是非常新的powershell,我试图创建一个脚本,将循环通过所有的子文件夹的一个文件夹,然后为每个子文件夹循环通过所有的文件和任何超过2天的旧复制到一个新的位置。下面是我目前的脚本,但我一直得到一个错误“方法调用失败,因为[System.IO.DirectoryInfo]不包含名为'replace'的方法”。有人知道我做错了什么吗

$RootFolder = "H:\route\Backup\Full_Backups"
$SubFolders = Get-ChildItem -Path $RootFolder -Directory
Foreach($SubFolder in $SubFolders)
{ 
    $NewPath = $SubFolder.replace('H:\', 'T:\')
    $threshold = (Get-Date).AddDays(-2)
foreach ($SubFolder in Get-ChildItem -LiteralPath $path -Directory) {
  # Construct sub-folder path
  $subPath = Join-Path $SubFolder.FullName "*\js\*"

  # Locate the files at *\js\*
  $files = Get-ChildItem $subPath -Recurse

  # Filter on Creation date
  $files = $files |Where-Object { $_.CreationTime -lt $threshold }

  # Remove files
  $files |Copy-Item -Destination $NewPath -WhatIf
}
}
kh212irz

kh212irz1#

太棒了,你正在进入PowerShell的世界:)
下面是脚本的优化版本。它从$RootFolder递归获取所有超过2天的文件。然后通过替换驱动器号将这些文件复制到新目录。

$RootFolder = "H:\route\Backup\Full_Backups"

$files = Get-ChildItem -Path $RootFolder -Recurse -File | Where-Object CreationTime -lt $threshold

foreach ($file in $files) {
  $file | Copy-Item -Destination $PSItem.FullName.Replace('H:\', 'T:\')
}

有时候,cmdlet“Get-Member”会有很大的帮助。每当你手头有对象,你总能做到“|gm”,它是Get-Member的别名。这将向您显示对象类型以及对象具有的所有属性和方法。
你最初的问题是,你试图对一个对象数组进行字符串替换。通过对$SubFolders.FullName执行替换,可以对对象的字符串属性执行替换。
希望有帮助!
享受PowerShell的乐趣!

hrysbysz

hrysbysz2#

根据我们的讨论。这是什么应该让你到你需要的地方。

精简版:

$RootFolder = "H:\SQLServer\Backup\Full_Backups"

(Get-ChildItem $RootFolder -Recurse -File) 
| Where { ((get-date) - ($_.LastWriteTime)) -gt (new-timespan -days 2 -hours 0 -minutes 0) } 
| ForEach-Object -Begin {} -Process { Write-Host "Copying $($_.FullName) to $($_.FullName.Replace("H:\", "T:\"))"; 
Copy-Item -Path ($_.FullName) -Destination ($_.FullName.Replace("H:\", "T:\")) }

未压缩:

$RootFolder = "H:\SQLServer\Backup\Full_Backups"

$files = (Get-ChildItem $RootFolder -Recurse -File)

foreach ($f in $files){

if (((get-date) - ($f.LastWriteTime)) -gt (new-timespan -days 2 -hours 0 -minutes 0))
{
$oldpath = $f.FullName

$newPath = ($f.FullName.Replace("H:\", "T:\"))

Write-Host ($f.FullName)

Write-Host $newPath

Copy-Item -Path $oldpath -Destination $newPath
} else {

}
}
kupeojn6

kupeojn63#

谢谢大家的帮助。我用下面的方法解决了这个问题:

$RootFolder = "H:\SQLServer\Backup\Full_Backups"
$subDir = (Get-ChildItem $RootFolder)
foreach($sub in $subDir) {
           $newpath = ($sub.FullName.replace('H:\','T:\'))
           $Source = $sub.FullName
           CD $Source
           Get-ChildItem ".\" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-2))} | Where-Object { $_.Name} | Move-Item -Force -Destination "$newpath\"
}

相关问题