Extrato de nome de arquivo - Powershell

3

Estou com problemas para extrair alguns dados de um nome de arquivo, pois parece que adicionar um espaço ao final do nome extraído, mesmo que eu tente usar o truque .trim () para removê-lo, não funciona. Também tentei contar o comprimento do nome do arquivo -1 e ele deixou o espaço, mas removeu o último caractere. Isso está tornando muito difícil direcionar um caminho para uma pasta criada, já que estou colocando o espaço no caminho. ..

Nomes de arquivos abaixo dos quais eu estou tentando extrair dados de

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

Estou tentando extrair o nome do programa de TV e criar uma pasta em um novo diretório e, em seguida, mover o arquivo para a pasta criada ..

Aqui está o código que estou usando ...

$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
        }

E aqui está o erro

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

Como você pode ver eu tenho para esta ilustração colocar a variável (tv show name) em uma 'sentença' para que você possa ver o espaço adicionado a ela .. Eu tentei adicionar \ s + que remove um dos espaços mas eu não pode se livrar do outro, independentemente de usar o truque ou não ..

Alguém pode ajudar, obrigado Connor Bracegirdle

    
por Connor Bracegirdle 10.06.2018 / 08:55

2 respostas

1

Só para mostrar uma expressão regular adequada é muito bem capaz de obtendo não apenas o nome, mas todos os elementos contidos no nome do arquivo. usando grupos de captura colocando as partes entre parênteses

** EDIT consulte o RegEX ao vivo no link **

## Q:\Test18\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]
        }
    }

O script faz a criação da subdiretória, a cópia e também mostra esta saída:

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

Árvore de exemplo no meu Ramdrive a:

> 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
    
por 10.06.2018 / 14:29
3

Verifique o resultado de -split. Cria uma matriz de 2 membros

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

O código modificado com tweak:

$TRANSFER = "E:\Code\PS\myPS18\Jun"
$TVSHOWS = "E:\code\PS\myPS18\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
}

Saída:

12 Monkeys@123
Colony@123
Prison Break@123
    
por 10.06.2018 / 10:05

Tags