Powershell'deki nesneleri üçüncü sütuna göre nasıl sıralayabilirim?


2

Bunun gibi bir metin dosyası var:

4108689096 2531 ./ssss/132432.odt
481446057 2293 ./abc/a.txt
3157353085 1096 ./dsjvbjf/c.docx
653380669 1824 ./bcd/x.avi

Ve Powershell'de listeyi üçüncü sütuna göre sıralamak istiyorum, ancak Sort-Objectbu listeyi dosya ismine göre sıralıyorum ( /her satırdaki son karakterden sonraki ilk karaktere göre ).

Böyle bir şey elde etmek isterim:

481446057 2293 ./abc/a.txt
653380669 1824 ./bcd/x.avi
3157353085 1096 ./dsjvbjf/c.docx
4108689096 2531 ./ssss/132432.odt

Bu yüzden de dahil olmak üzere bir dize olarak üçüncü sütuna göre sıralamak istiyorum ., /karakterler.


Düzenleme # 1: Bazı ilgili kodlar

# Gets a relative path based on a base and a full path (to file)
# 
# Usage: RelativePath <path to file> <base path>
# 
# Note: Specifying arguments is mandatory.
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)
}

# Calculates CRC checksums for all files in the specified directory and writes
# the checksums to a file
# 
# Usage: CRCSumAll <path to folder to check> <file conatining checksums>
# 
# Note: Specifying arguments is mandatory.
function global:CRCSumAll
{
    param($inputpath,$outputfile)

    $allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} | Sort-Object Name

    new-item -force -type file $outputfile

    cd $inputpath
    foreach ($file in $allfiles)
    {
        $relfile=RelativePath $file.fullname $inputpath
        $relfile=$relfile -replace("\\","/")
        $relfile="./$relfile"
        cksum.exe $relfile | Out-File -Encoding OEM -Append $outputfile
    }
}

Düzenleme # 2: Çözüm

Sorunun ne olduğunu anladım. Sıralamadan sonra göreceli yolları ekledim. Yani doğru kod:

function global:CRCSumAll
{
    param($inputpath,$outputfile)

    $allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} #| Sort-Object Name

    new-item -force -type file $outputfile

    cd $inputpath
    foreach ($file in $allfiles)
    {
        $relfile=RelativePath $file.fullname $inputpath
        $relfile=$relfile -replace("\\","/")
        $relfile="./$relfile"
        $relfile | Out-File -Encoding OEM -Append $outputfile
    }

    $sorted=Get-Content $outputfile | Sort-Object
    new-item -force -type file $outputfile
    $sorted | Out-File -Encoding OEM -Append $outputfile

    $forcksum=Get-Content $outputfile
    new-item -force -type file $outputfile
    $forcksum | Foreach-Object { cksum.exe $_ | Out-File -Encoding OEM -Append $outputfile}
}

Şimdi sadece kodu biraz temizlemem gerekiyor, çünkü üç kez dosya yazmak gerçekten çok çirkin. :)


O zaman sorunun ne olduğundan emin değilim. Gönderdiğin kodu aldım, koştum ve sıraladım.
— EBGreen

@EBGreen Yardımınız için teşekkürler. Ne yapacağımı bilmiyorum ama cevabını kabul ediyorum ya da kendi sorum için bir cevap yaz, çünkü bana çok yardımcı oldun ve sanırım itibarı hak ediyorsun.
— szantaii

Meh, temsilci için endişelenmiyorum. Benim tercihim, çözüm, neden ve nerede hakkında güzel bir yazı yazmanız olabilir.
— EBGreen

Tamam, o zaman yapacağım.
— szantaii

Yanıtlar:


2

Böyle bir şey dene:

Import-CSV C:\Path\To\File.txt -Header ('foo', 'bar', 'wombat') -delimiter ' ' | Sort-Object wombat

Girdiyi iyi tanımlanmış sütunlara sahip olduğu sürece ölçütleri karşıladığı için orijinal cevabımı bırakacağım. Yorumlara dayanarak, çözüm dizilimi oluştururken sıralamaktır:

$allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} | Sort-Object Name
cd $inputpath
foreach ($file in $allfiles) {cksum.exe $file | Out-File -Append $pathtooutputfile}

Teşekkürler. Bu neredeyse işe yarıyor ancak boşluk karakterleri içeren dosya isimleri ve dizin isimleri bu konuyu karıştırıyor.
— szantaii

O zaman uygun sütunların yok.
— EBGreen

Metin dosyasını tam olarak nasıl oluşturuyorsunuz?
— EBGreen

Aslında cksum kullanıyorum:$allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} cd $inputpath foreach ($file in $allfiles) {cksum.exe $file | Out-File -Append $pathtooutputfile}
— szantaii

Düzenleme için teşekkürler, ama ben bunu kullanıyorum. Soruyu düzenledim ve daha fazla kod ekledim. Her neyse, teşekkürler.
— szantaii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.