Powershell: вычтите $ pwd из $ file.Fullname - PullRequest
5 голосов
/ 12 февраля 2010

Имеются следующие файлы:

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

например. если $ 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

Ответы [ 4 ]

6 голосов
/ 12 февраля 2010

Я бы использовал фильтр здесь и рассмотрел бы рассылку файлов следующим образом:

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\

Обратите внимание, что при замене учитывается регистр.


Если вам потребуется замена без учета регистра, регулярные выражения помогут: ( редактирование на основе комментария Кейта. Спасибо, Кейт! )

filter cirebase($from=($pwd.Path), $to)  {
    $_.Fullname -replace [regex]::Escape($from), $to
}
3 голосов
/ 19 февраля 2010

Для этого есть командлет, Split-Path , опция -leaf дает имя файла. Также есть Join-Path , так что вы можете попробовать что-то вроде этого:

dir c:\dev\deploy | % {join-path c:\temp\files (split-path $_ -leaf)} | % { *action_to_take* }
2 голосов
/ 12 февраля 2010

Для меня это очень хорошо работает:

gci c:\dev\deploy -r -name | %{"c:\temp\$_"}
1 голос
/ 12 февраля 2010

Как насчет чего-то вроде:

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
}

Я взял простой относительный путь из здесь , хотя есть некоторые проблемы с ним, но, поскольку вы хотите обрабатывать только пути ниже вашего рабочего каталога, все должно быть в порядке.

...