1

我正在尝试制作一个脚本,从某个地方复制文件并将其存储在另一个地方。我正在递归地使用 foreach 来获取所有文件。

问题是:如何获取路径段并将其替换为另一个字符串?我想做这样的事情:

复制文件从

C:\sites\somefolder\folder1\file.php

C:\sites\anotherfolder\folder1\file.php

在此示例中,我需要将“somefolder”替换为“anotherfolder”。这就是我获得完整路径的方式:

foreach ($i in Get-ChildItem -Recurse -Force) { 
   Write-host $i.Fullname
}

在循环内部,我尝试使用 Fullname.replace 替换它,但事情并没有按预期工作:

$i.Fullname.Replace($PWD, "anotherfolder")
# This returns "anotherfolder/folder1/file.php", 
# instead of "c:\sites\anotherfolder\folder1\file.php

我不太了解 Powershell 编程,所以请多多包涵,好吗?

谢谢!

4

3 回答 3

3

$PWD 返回一个 PathInfo 对象,而不是您可能期望的字符串。 $PWD.Path返回一个字符串,但即使这样也可能有问题,因为您正在尝试匹配整个路径。如果您提前知道源和目的地,并且它们都将留在 中c:\sites\,则可以执行以下操作:

$source = "somefolder"
$destination = "anotherfolder"

foreach ($i in Get-ChildItem -Recurse -Force) 
{ 
    $path = $i.DirectoryName -replace $source, $destination
    $name = $i.Fullname -replace $source, $destination
    if(!(Test-Path $path)) { New-Item -Path $path -ItemType directory }
    Copy-Item $i $name
}

因为你提到你是 powershell 新手,所以我把它写得有点冗长。它将新路径和名称变量的源内容替换为目标内容。然后它会检查您的目标目录是否存在,如果不存在则创建它,然后将项目复制到那里。

当您更改父目录时,您可以在要替换的源字符串中包含更多的源路径。在这种情况下,您可能希望使用[regex]::Escape($Source)转义特殊字符。

于 2013-09-12T16:01:05.017 回答
0
$i.Fullname.Replace($PWD, "anotherfolder")

我认为您的问题出在 $PWD 变量中;尝试直接设置字符串名称或检查 $PWD 对象类型。

我在我的电脑上尝试了同样的事情;当变量 $PWD 包含 Name 属性时,它可以正常工作:

$PWD = (gi .).Name
于 2013-09-12T15:45:51.387 回答
0
foreach ($i in (Get-ChildItem -Recurse -Force)) { 
   $destination = $i.DirectoryName -Replace '\\somefolder','\anotherfolder'
   copy-item -path $i.fullname -destination $destination
}

注意: .Replace 方法不起作用 $i.directoryname 但 -replace 可以正常工作并且具有成为正则表达式运算符的好处(因此双 \ 转义)。

于 2013-09-12T16:06:50.357 回答