
.trim() 트릭을 사용하여 제거하려고 해도 추출된 이름 끝에 공백을 추가하는 것처럼 보이기 때문에 파일 이름에서 일부 데이터를 추출하는 데 문제가 있습니다. 또한 파일 이름 -1의 길이를 세어 보았는데 공백은 남지만 대신 마지막 문자가 제거되었습니다. 경로에 공백을 넣기 때문에 생성된 폴더에 대한 경로를 지정하는 것이 매우 어렵습니다. ..
아래에서 데이터를 추출하려는 파일 이름
12 Monkeys S02E10 - Fatherland.txt
Colony S02E01 - Eleven Thirteen.txt
Prison Break S05E05 - Contingency.txt
TV 프로그램 이름을 추출하고 새 디렉터리에 폴더를 만든 다음 생성된 폴더로 파일을 이동하려고 합니다.
내가 사용하는 코드는 다음과 같습니다.
$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
}
그리고 여기에 오류가 있습니다.
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
보시다시피 이 그림에서는 변수(TV 프로그램 이름)를 '문장'에 넣어 공백이 추가된 것을 볼 수 있습니다. 공백 중 하나를 제거하는 \s+를 추가하려고 시도했지만 그럴 수 없습니다. 트림 트릭 사용 여부에 관계없이 다른 하나를 제거하십시오..
누군가 도와줄 수 있나요, 감사합니다 Connor Bracegirdle
답변1
적절한 정규식을 표시하는 것만으로도
이름뿐만 아니라
해당 부분을 괄호로 묶는 캡처 그룹을 사용하여 파일 이름에 포함된 모든 요소를 얻을 수 있습니다.
**EDIT는 RegEX 라이브를 참조하세요.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]
}
}
스크립트는 하위 디렉터리 생성, 복사를 수행하고 다음 출력도 표시합니다.
Name Series Episode Title
---- ------ ------- -----
12 Monkeys 02 10 Fatherland
Colony 02 01 Eleven Thirteen
Prison Break 05 05 Contingency
내 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
답변2
-split의 결과를 확인하십시오. 2개의 멤버로 구성된 배열을 생성합니다.
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
수정된 코드는 다음과 같습니다.
$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
}
산출:
12 Monkeys@123
Colony@123
Prison Break@123