#For use with Batch file, Accepts one File at a time. Geared for WTV Files (WMC TS formatted files) No Quotes around Destination drive. [as example powershell.exe "C:\Folder\File.wtv" C:\Folder\SubFolder {" Marks around the Destination will cause failures}]
# It does not matter if you put a \ or not at the end of the Destination input. [powershell removes it anyways when taken as an argument]
Param ([String]$InputFilewithpath, [String]$destination)
$NP = $InputFilewithpath
$DL = $destination
$DL = "$DL\"
$Ff = ".wtv"
[array]$MC = 1,21,27,159,210,273,278,281 #Array used for verifing File details, Used to check File copy
function Log-File {
$a = Get-Date
if ( $a.day -lt 10) {$d = "0"+$a.day} else {$d = $a.day}
if ( $a.month -lt 10) {$m = "0"+$a.month} else {$m = $a.month}
if ( $a.hour -lt 10) {$h = "0"+$a.hour} else {$h = $a.hour}
if ( $a.minute -lt 10) {$mi = "0"+$a.minute} else {$mi = $a.minute}
if ( $a.second -lt 10) {$s = "0"+$a.second} else {$s = $a.Second}
$y = $a.Year
$Fn = "$y$m$d$h$mi$s"
return $Fn
} #Prevention of overrighting other log files, 1 per file.
function Char-Rep {
$CR = $args[0] -replace "\:", ','
$CR = $CR -replace '[\*\/\\]', '-'
$CR = $CR -replace "\?", ''
return $CR
} #Removes Forbidden Windows Characters for names
function Copy-File {
param( [string]$from, [string]$to)
$ffile = [io.file]::OpenRead($from)
$tofile = [io.file]::OpenWrite($to)
Write-Progress -Activity "Copying file" -status "$from -> $to" -PercentComplete 0
try {
[byte[]]$buff = new-object byte[] 4096
[int]$total = [int]$count = 0
do {
$count = $ffile.Read($buff, 0, $buff.Length)
$tofile.Write($buff, 0, $count)
$total += $count
if ($total % 1mb -eq 0) {
Write-Progress -Activity "Copying file" -status "$from -> $to" `
-PercentComplete ([int]($total/$ffile.Length* 100))
}
} while ($count -gt 0)
}
finally {
$ffile.Dispose()
$tofile.Dispose()
Write-Progress -Activity "Copying file" -Status "Ready" -Completed
}
} #Copy file with Inputs, using progress bar
function Get-Meta {
Param([String]$NamePass, [String]$MetaNumber, [String]$IsDate)
$FullName = $NamePass
$Folder = Split-Path $FullName
$File = Split-Path $FullName -Leaf
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.namespace($Folder)
$Item = $objFolder.items().item($File)
$MD = $objFolder.GetDetailsOf($Item, $MetaNumber)
if ($IsDate -eq 'Y') {
$MD = $MD.substring(0,$MD.length-11)
} #Date Check & modification, prevention of error
$IsDate = 0
$MD = Char-Rep $MD
return $MD
} #Gets Metadata, open to all formating, Geared for WTV Files (WMC TS formating)
function Meta-name {
Param([int]$MN)
$MDv = 0
if ($MN -eq 1) {$MD = 'File Size';$mDv = 1}
if ($MN -eq 10) {$MD = 'Owner of file';$mDv = 1}
if ($MN -eq 16) {$MD = 'Genre of Show';$mDv = 1}
if ($MN -eq 21) {$MD = 'Name of Show';$mDv = 1}
if ($MN -eq 27) {$MD = 'Play length';$mDv = 1}
if ($MN -eq 159) {$MD = 'File extension';$mDv = 1}
if ($MN -eq 160) {$MD = 'File Name';$mDv = 1}
if ($MN -eq 185) {$MD = 'Parent Folder name';$mDv = 1}
if ($MN -eq 187) {$MD = 'Path to Folder';$mDv = 1}
if ($MN -eq 189) {$MD = 'Full path to file';$mDv = 1}
if ($MN -eq 210) {$MD = 'Episode Name';$mDv = 1}
if ($MN -eq 273) {$MD = 'Channel Recorded on';$mDv = 1}
if ($MN -eq 274) {$MD = 'Episode Name';$mDv = 1}
if ($MN -eq 278) {$MD = 'Original Air Date';$mDv = 1}
if ($MN -eq 279) {$MD = 'Show/Episode Details';$mDv = 1}
if ($MN -eq 281) {$MD = 'Channel Callsign';$mDv = 1}
if ($MDv -eq 0) {$MD = 'Unnamed Metadata Number';$mDv = 1}
$MDo = "$MN - $MD"
return $MDo
} #Used to retrieve Metadata Name for the Numbers. Geared for WTV Files (WMC TS formating)
$SH = Get-Meta $NP 21 N
$EP = Get-Meta $NP 210 N
$OA = Get-Meta $NP 278 Y
$DF = "$DL$SH-$EP=$OA$Ff"
if ( -not($EP ='')) {
Copy-File $NP $DF
$NoMeta = 0
} #Test if File already exists that matches Meta-data format, Copies with user friendly name from meta data
Else {
$fold = Log-File
$file = "$SH-$EP=$OA$Ff"
$DL = "$DL$Fold-nometa\"
$DF = "$DL$file"
New-item -path "$DL" -ItemType directory
Copy-File "$NP" "$DF"
$NoMeta = 1
} #Used for Files without proper Episode Name Metadata, Changes Destinations to preserve files/prevent overwriting.
if ( Test-Path "$DF" -PathType Leaf) {
$CFc = 0
$date = Get-Date
$Logname = Log-File
Write-Output "$DF" > "$DL$Logname-$SH-$EP=$OA.txt"
foreach ($i in $MC) {
$dc = 'N'
if ($i -eq 278 -and $NoMeta -eq 0) {$dc = 'Y'}
$MS = Get-Meta $NP $i $dc
$MD = Get-Meta $DF $i $dc
$meta = Meta-name $i
if ( -not($MS -eq $MD)) {Write-OutPut "[$meta] Source- $MS || $MD -Destination (Failed Check)" >> "$DL$Logname-$SH-$EP=$OA.txt";$CFc = $CFc +1}
if ($MS -eq $MD) {Write-OutPut "[$meta] $MS (Pass Check)" >> "$DL$Logname-$SH-$EP=$OA.txt"}
if ($CFc -gt 0) {Write-Output "File Copy Failure, Something did not work. $DF deleted" >> "$DL$Logname-$SH-$EP~$OA.txt"; Remove-Item $DF; Rename-item "$DL$Logname-$SH-$EP~$OA.txt" "$DL$Logname-FAIL-$SH-$EP~$OA.txt"}
}#Verification Loop, Destination file deleted in failure/Mismatch
} #Test for File tampering/failure to copy
else
{
$date = Get-Date
$desktop = [Environment]::GetFolderPath("Desktop")
$Logname = Log-File
Write-Output "$DF Missing after Copy from $NP, attempt made $date" > $desktop\$Logname-$SH-$EP~$OA.txt
}#incase File or folder is not where expected, defaults to desktop for log file
if ( Test-Path "$DF" -PathType Leaf) {
Remove-Item $NP
} #Deletes Source File after completion, Runs after checks for failure/non-existence
Comments
0 B
|👍
/👎