Câu hỏi Trích xuất tên tệp - Powershell


Tôi đang gặp sự cố khi trích xuất một số dữ liệu từ tên tệp vì có vẻ như đang thêm dấu cách vào cuối tên được trích xuất ngay cả khi tôi thử sử dụng thủ thuật .trim () để xóa nó không hoạt động. Tôi cũng đã thử đếm chiều dài của tên tệp -1 và nó rời khỏi không gian nhưng đã xóa ký tự cuối cùng thay vào đó .. điều này khiến tôi rất khó để hướng đường dẫn đến thư mục được tạo vì tôi đặt không gian vào đường dẫn ..

Tên tệp bên dưới mà tôi đang cố trích xuất dữ liệu từ

12 Monkeys S02E10 - Fatherland.txt
Colony S02E01 - Eleven Thirteen.txt
Prison Break S05E05 - Contingency.txt

Tôi đang cố trích xuất tên chương trình truyền hình và tạo một thư mục trong một thư mục mới rồi di chuyển tệp vào thư mục đã tạo ..

Đây là mã tôi đang sử dụng ..

$TRANSFER = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TRANSFER\'
$TVSHOWS = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\'
$pattern = ‘\s+\S[0-9][0-9].*’

Get-ChildItem "$TRANSFER/*.txt" |
    ForEach-Object{

        $target = $_.BaseName -split $pattern

        Write-Host $target@123

      $jon = $TVSHOWS+$target


        If( -not (test-path $jon)) 
            {
            New-Item -ItemType Directory -force -Path $jon
            }

        Copy-Item -path $_.FullName -Destination $jon
        }

Và đây là lỗi

Quantico @123
Copy-Item : Could not find a part of the path 
'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\Quantico \Quantico S02E10 - 
JMPALM.txt'.
At line:20 char:9
+         Copy-Item -path $_.FullName -Destination $jon
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Copy-Item], DirectoryNotFoundExcept 
   ion
    + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerSh 
   ell.Commands.CopyItemCommand

Như bạn có thể thấy tôi có minh họa này đặt biến (tên chương trình truyền hình) thành một 'câu' để bạn có thể thấy không gian được thêm vào nó .. Tôi đã thử thêm \ s + loại bỏ một trong các khoảng trống nhưng tôi không thể loại bỏ một thứ khác bất kể sử dụng mẹo cắt hay không ..

Ai đó có thể giúp, cảm ơn Connor Bracegirdle


3
2018-06-10 06:55


gốc




Các câu trả lời:


Chỉ để thể hiện một biểu thức chính quy phù hợp là rất tốt
không chỉ tên mà còn tất cả các phần tử có trong tên tệp
bằng cách sử dụng các nhóm chụp kèm theo các phần trong dấu ngoặc đơn

** EDIT xem RegEX trực tiếp trên https://regex101.com/r/Vbhq7D/1 **

## Q:\Test\2018\06\10\SU_1330038.ps1
$TRANSFER = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TRANSFER\'
$TVSHOWS  = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\'

$Pattern = '(.*)\s+S(\d{2})E(\d{2})[\- ]+(.*)'
Get-ChildItem $TVSHOWS *.txt| Where-Object BaseName -match $Pattern |
    ForEach-Object{
        $jon = Join-Path $TVSHOWS $Matches[1]

        If( -not (Test-Path $jon)) {
            New-Item -ItemType Directory -Force -Path $jon |Out-Null
        }
        $_ | Copy-Item -Destination $jon

        [pscustomobject]@{
            Name   = $Matches[1]
            Series = $Matches[2]
            Episode= $Matches[3]
            Title  = $Matches[4]
        }
    }

Tập lệnh thực hiện tạo thư mục con, bản sao và cũng hiển thị kết quả này:

Name         Series Episode Title
----         ------ ------- -----
12 Monkeys   02     10      Fatherland
Colony       02     01      Eleven Thirteen
Prison Break 05     05      Contingency    

Cây mẫu trên Ramdrive của tôi là:

> tree A: /F
A:\
│   12 Monkeys S02E10 - Fatherland.txt
│   Colony S02E01 - Eleven Thirteen.txt
│   Prison Break S05E05 - Contingency.txt
│
├───12 Monkeys
│       12 Monkeys S02E10 - Fatherland.txt
│
├───Colony
│       Colony S02E01 - Eleven Thirteen.txt
│
└───Prison Break
        Prison Break S05E05 - Contingency.txt

1
2018-06-10 12:29



Cảm ơn LotPings, tôi đã giải quyết cho chương trình truyền hình với tất cả các tập từ các phần trong 1 thư mục để giúp tôi viết kịch bản dễ dàng hơn khi tôi mới dùng PowerShell, điều này mang lại cho tôi cái nhìn sâu sắc về cách tôi có thể thực hiện các thư mục mùa cũng .. chỉ là một câu hỏi .. làm thế nào các trận đấu {1-4} liên quan đến mô hình $ ..? Làm thế nào để nó xác định mỗi một như một thể loại cá nhân? - Connor Bracegirdle
Xin lỗi § $% &! Ứng dụng Android không cho phép đăng nhận xét. Tôi đã bao gồm một liên kết đến regex101.com nơi Biểu thức chính quy được mô tả chi tiết ở góc trên bên phải. Tính từ trái sang phải mỗi cặp dấu ngoặc đơn (nhóm chụp) trong mẫu được lưu trong bộ sưu tập $ Kết quả phù hợp [1..4]. - LotPings
Cảm ơn LotPings, ví dụ bạn đã cho tôi với trang web regex đã làm cho nó rất rõ ràng làm thế nào để sử dụng regex cũng như trước khi thực hiện nó vào kịch bản của tôi. Tôi đã quản lý để thực hiện mùa vào mã này là tốt .. cảm ơn nhiều đánh giá cao - Connor Bracegirdle


Kiểm tra kết quả của -split. Nó tạo ra một mảng gồm 2 thành viên

10JUN2018:012955 /:> $txts = Get-ChildItem "$TRANSFER/*.txt"
10JUN2018:012955 /:> ($txts[0].basename -split $pattern).GetType()

IsPublic IsSerial Name                                     BaseType                                                            
-------- -------- ----                                     --------                                                            
True     True     String[]                                 System.Array   
10JUN2018:012955 /:>"some random stuff" -split " stuff"
some random

10JUN2018:013239 /:>("some random stuff" -split " stuff")[0]
some random

Mã được sửa đổi với tinh chỉnh:

$TRANSFER = "E:\Code\PS\myPS\2018\Jun\10"
$TVSHOWS = "E:\code\PS\myPS\2018\Jun\TV_SHOW\"
$pattern = ‘\s+\S[0-9][0-9].*’

Get-ChildItem "$TRANSFER/*.txt"| ForEach-Object {
    $target = ($_.BaseName -split $pattern)[0]
    Write-Host "$target@123"
    $jon = $TVSHOWS+$target
}

Đầu ra:

12 Monkeys@123
Colony@123
Prison Break@123

3
2018-06-10 08:05



Cảm ơn Ketanbhut! Đã cố gắng để giải quyết điều này trong một vài ngày nay .. Tôi đã thử [0] ở phần cuối của sự chia rẽ nhưng không nghĩ để thử các dấu ngoặc! Một cái gì đó rất đơn giản, cảm ơn cho giải thích nó là tốt, nhiều apprciated - Connor Bracegirdle