Учитывая следующие файлы:
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
?
Для этого есть командлет Split-Path , опция -leaf дает имя файла. Также существует Join-Path , так что вы можете попробовать что-то вроде этого:
dir c:\dev\deploy | % {join-path c:\temp\files (split-path $_ -leaf)} | % { *action_to_take* }
Я бы использовал filter и рассмотрите возможность передачи файлов по конвейеру следующим образом:
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
}
Это работает довольно хорошо для меня:
gci c:\dev\deploy -r -name | %{"c:\temp\$_"}
Как насчет чего-то вроде:
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
}
Я взял простой относительный путь из здесь, хотя с ним есть некоторые проблемы, но поскольку вы хотите работать только с путями ниже вашего рабочего каталога, это должно быть нормально.