Powershell:从$ file.Fullname中减去$ pwd

时间:2010-02-12 16:09:21

标签: powershell path split

给出以下文件:

c:\dev\deploy\file1.txt
c:\dev\deploy\file2.txt
c:\dev\deploy\file3.txt
c:\dev\deploy\lib\do1.dll
c:\dev\deploy\lib\do2.dll

e.g。如果$ pwd是以下

c:\dev\deploy

运行语句

$files = get-childitem

我想使用此列表并使用foreach ($file in $files)我想用$pwd代替我自己的路径,例如我想打印c:\temp\files,如下所示:

c:\temp\files\file1.txt
c:\temp\files\file2.txt
c:\temp\files\file3.txt
c:\temp\files\lib\do1.dll
c:\temp\files\lib\do2.dll

我怎样才能实现这一点,即

A = c:\dev\deploy\file1.txt - c:\dev\deploy\
B = c:\temp\files\ + A

giving B = c:\temp\files\file1.txt

5 个答案:

答案 0 :(得分:6)

我会在这里使用过滤器,并考虑像这样管道文件:

filter rebase($from=($pwd.Path), $to)  {
    $_.FullName.Replace($from, $to)
}

您可以这样称呼它:

Get-ChildItem C:\dev\deploy | rebase -from C:\dev\deploy -to C:\temp\files\
Get-ChildItem | rebase -from (Get-Location).path -to C:\temp\files\
Get-ChildItem | rebase -to C:\temp\files\

请注意,替换区分大小写。


如果您需要不区分大小写的替换,正则表达式会有所帮助: (根据Keith的评论编辑。感谢Keith!

filter cirebase($from=($pwd.Path), $to)  {
    $_.Fullname -replace [regex]::Escape($from), $to
}

答案 1 :(得分:3)

有一个cmdlet,拆分路径 -leaf 选项为您提供文件名。还有加入路径,所以你可以尝试这样的事情:

dir c:\dev\deploy | % {join-path c:\temp\files (split-path $_ -leaf)} | % { *action_to_take* }

答案 2 :(得分:2)

这对我很有用:

gci c:\dev\deploy -r -name | %{"c:\temp\$_"}

答案 3 :(得分:1)

如下:

function global:RelativePath
{
    param
    (
        [string]$path = $(throw "Missing: path"),
        [string]$basepath = $(throw "Missing: base path")
    )

    return [system.io.path]::GetFullPath($path).SubString([system.io.path]::GetFullPath($basepath).Length + 1)
}    

$files = get-childitem Desktop\*.*

foreach($f in $files)
{
    $path = join-path "C:\somepath" (RelativePath $f.ToString() $pwd.ToString())
    $path | out-host
}

我从here获取了简单的相对路径,尽管它存在一些问题,但由于您只想处理工作目录下的路径,所以应该没问题。

答案 4 :(得分:1)

接受的答案仅在没有子文件夹的情况下有效

如果您需要“转换”子文件夹,则@stej的答案更好。

这里是我的版本:

 Get-ChildItem -Recurse | ForEach-Object { $_.Fullname.Replace('D:\Work\Test\Release', 'C:\temp\files') }

注意:.replace不需要转义