Gå til innhold

[Løst] Script som flytter videofiler til mapper basert på timestamp i filnavn


Anbefalte innlegg

Jeg har ingen erfaring med scripts, men har funnet et som jeg tror vil hjelpe meg. Utgangspunkt er at jeg flytter videofiler fra ulike mobiler og kameraer, som så dumpes i en mappe på pc'n. Det jeg ønsker scriptet skal gjøre er å organisere disse mp4 filene i respektive mapper basert på årstall og måned utfra timestamp i filnavnet.

Filnavnet er slik: 2015-04-03_113801.mp4

Scriptet er slik:

@echo off

set "target=C:\Users\arne\Desktop\sortert"

pushd "C:\Users\arne\Desktop\usortert"

for /f "tokens=1,2 delims=-_" %%G in ('dir /b /a-d ') do ( echo processing "%%G %%H" md "%target%\%%G\%%H" move "%%G" "%target%\%%G\%%H" )

popd

Det som skjer er at mappene blir slik jeg ønsker dem, men ingen filer blir flyttet. Feilmeldingen er at "Systemet finner ikke angitt fil" Er det noen som ser hva som er feil?

Endret av Havnegata
Lenke til kommentar
Videoannonse
Annonse

Har ikke holdt særlig på med windows bat filer siden win9x tiden, så det er godt mulig regler er snudd på hodet siden den tid. Derfor blir det litt gjetning:

Jeg tror at echo, md og move bør stå på hver sin linje for at det skal fungere.

Lenke til kommentar

Siden jeg trenger mer erfaring med Powershell uansett, har jeg laget et nytt og bedre skript til deg med Powershell. Batch er greit til enkle ting, men blir lett krevende og upålitelig.

 

Hvordan du bruker skriptet jeg laget:

  1. Start powershell eller cmd.
  2. Kjør skriptet (forhåndsvisning):
    • Med Powershell:
      .\OrganizeFiles.ps1 .\usortert .\sortert -dryRun
    • Med cmd:
      powershell -ExecutionPolicy Bypass -File .\OrganizeFiles.ps1 .\usortert .\sortert -dryRun
      
  3. Hvis du er fornøyd, kjør skriptet igjen uten «-dryRun».

Eksempel på filnavn: OrganizeFiles.ps1

param(
    [Parameter(Mandatory = $true)]
    [string] $sourceDir,
    [Parameter(Mandatory = $true)]
    [string] $targetDir,
    [switch] $dryRun = $false
)

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

$fakePathsForDryRun = New-Object -TypeName 'System.Collections.Generic.HashSet[string]'


function getUniqueFilePath($path)
{
    if (-not (Test-Path -Path $path)) {
        if (-not $dryRun -or -not $fakePathsForDryRun.Contains($path)) {
            return $path
        }
    }

    $dir = Split-Path -Path $path
    $fileNameWithoutExt = [IO.Path]::GetFileNameWithoutExtension($path)
    $ext = [IO.Path]::GetExtension($path)

    $newFileName = $fileNameWithoutExt + "-" + [guid]::NewGuid() + $ext
    $newPath = Join-Path -Path $dir -ChildPath $newFileName

    return $newPath
}

function tryMoveFile($source, $desiredDestination)
{
    $newDestination = getUniqueFilePath $desiredDestination
    if ($desiredDestination -ne $newDestination) {
        Write-Warning ('File "{0}" exists; renaming to "{1}".' -f $desiredDestination, $newDestination)
    }

    Write-Output ('Moving file: {0} -> {1}' -f $source, $newDestination)

    if ($dryRun) {
        $fakePathsForDryRun.Add($newDestination) | Out-Null
        return
    }

    Move-Item -Path $source -Destination $newDestination
}


if ($dryRun) {
    Write-Warning "Performing a dry run; no changes will be made."
}

Resolve-Path -Path $sourceDir | Out-Null

if (Test-Path -Path $targetDir) {
    if (-not (Test-Path -Path $targetDir -PathType Container)) {
        throw "Path exists but it is not a directory: $targetDir"
    }
}

$sourceFiles = Get-ChildItem -Path $sourceDir -Recurse -File

foreach ($sourceFile in $sourceFiles) {
    $sourceFilePath = Resolve-Path -Path $sourceFile.FullName
    $sourceFileName = Split-Path -Path $sourceFilePath -Leaf

    if (-not ($sourceFileName -match '^(\d{4})-(\d{2})-\d{2}_\d+')) {
        Write-Warning "Skipping file: $sourceFilePath"
        continue
    }

    $year = $Matches[1]
    $month = $Matches[2]
    $newParentDir = Join-Path -Path $targetDir -ChildPath "$year/$month"

    if (-not (Test-Path -Path $newParentDir)) {
        if (-not $dryRun) {
            New-Item -Path $newParentDir -ItemType Directory | Out-Null
        }
    }

    if (-not $dryRun) {
        $newParentDir = Resolve-Path -Path $newParentDir
    }

    $desiredNewFilePath = Join-Path -Path $newParentDir -ChildPath $sourceFileName
    tryMoveFile $sourceFilePath $desiredNewFilePath
}

Eksempel på output (forhåndsvisning):

PS C:\Users\Steffen\Desktop> .\OrganizeFiles.ps1 .\usortert .\sortert -dryRun
WARNING: Performing a dry run; no changes will be made.
Moving file: C:\Users\Steffen\Desktop\usortert\2015-02-03_113801.mp4 -> .\sortert\2015\02\2015-02-03_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2015-04-01_113801.mp4 -> .\sortert\2015\04\2015-04-01_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2017-04-04_113801.mp4 -> .\sortert\2017\04\2017-04-04_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2017-07-07_113801.mp4 -> .\sortert\2017\07\2017-07-07_113801.mp4
WARNING: File ".\sortert\2015\02\2015-02-03_113801.mp4" exists; renaming to ".\sortert\2015\02\2015-02-03_113801-87581006-b874-4800-9239-cb326aeb6c89.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2015-02-03_113801.mp4 -> .\sortert\2015\02\2015-02-03_113801-87581006-b874-4800-9239-cb326aeb6c89.mp4
WARNING: File ".\sortert\2015\04\2015-04-01_113801.mp4" exists; renaming to ".\sortert\2015\04\2015-04-01_113801-bedcc505-f341-4a6b-ad32-8ffb6cfe9037.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2015-04-01_113801.mp4 -> .\sortert\2015\04\2015-04-01_113801-bedcc505-f341-4a6b-ad32-8ffb6cfe9037.mp4
WARNING: File ".\sortert\2017\04\2017-04-04_113801.mp4" exists; renaming to ".\sortert\2017\04\2017-04-04_113801-fd443e18-431d-4640-9d1e-ae96e533fb57.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2017-04-04_113801.mp4 -> .\sortert\2017\04\2017-04-04_113801-fd443e18-431d-4640-9d1e-ae96e533fb57.mp4
WARNING: File ".\sortert\2017\07\2017-07-07_113801.mp4" exists; renaming to ".\sortert\2017\07\2017-07-07_113801-5d69697e-f199-406b-a229-1326f974bcef.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2017-07-07_113801.mp4 -> .\sortert\2017\07\2017-07-07_113801-5d69697e-f199-406b-a229-1326f974bcef.mp4
WARNING: Skipping file: C:\Users\Steffen\Desktop\usortert\New folder\New folder.rar

Eksempel på output (gjør endringer):

PS C:\Users\Steffen\Desktop> .\OrganizeFiles.ps1 .\usortert .\sortert
Moving file: C:\Users\Steffen\Desktop\usortert\2015-02-03_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2015\02\2015-02-03_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2015-04-01_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2015\04\2015-04-01_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2017-04-04_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2017\04\2017-04-04_113801.mp4
Moving file: C:\Users\Steffen\Desktop\usortert\2017-07-07_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2017\07\2017-07-07_113801.mp4
WARNING: File "C:\Users\Steffen\Desktop\sortert\2015\02\2015-02-03_113801.mp4" exists; renaming to
"C:\Users\Steffen\Desktop\sortert\2015\02\2015-02-03_113801-aa1c59b7-9e03-45ae-9b90-439bec133fa7.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2015-02-03_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2015\02\2015-02-03_113801-aa1c59b7-9e03-45ae-9b90-439bec133fa7.mp4
WARNING: File "C:\Users\Steffen\Desktop\sortert\2015\04\2015-04-01_113801.mp4" exists; renaming to
"C:\Users\Steffen\Desktop\sortert\2015\04\2015-04-01_113801-cffbd170-6cf7-436f-9ec8-bae7a886fb72.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2015-04-01_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2015\04\2015-04-01_113801-cffbd170-6cf7-436f-9ec8-bae7a886fb72.mp4
WARNING: File "C:\Users\Steffen\Desktop\sortert\2017\04\2017-04-04_113801.mp4" exists; renaming to
"C:\Users\Steffen\Desktop\sortert\2017\04\2017-04-04_113801-9d5d4e8b-39e3-4ece-850e-4ca2bd12fa5e.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2017-04-04_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2017\04\2017-04-04_113801-9d5d4e8b-39e3-4ece-850e-4ca2bd12fa5e.mp4
WARNING: File "C:\Users\Steffen\Desktop\sortert\2017\07\2017-07-07_113801.mp4" exists; renaming to
"C:\Users\Steffen\Desktop\sortert\2017\07\2017-07-07_113801-b09067c2-8a62-4f73-9d01-6bc5bded50b9.mp4".
Moving file: C:\Users\Steffen\Desktop\usortert\New folder\2017-07-07_113801.mp4 -> C:\Users\Steffen\Desktop\sortert\2017\07\2017-07-07_113801-b09067c2-8a62-4f73-9d01-6bc5bded50b9.mp4
WARNING: Skipping file: C:\Users\Steffen\Desktop\usortert\New folder\New folder.rar
Lenke til kommentar

Har ikke holdt særlig på med windows bat filer siden win9x tiden, så det er godt mulig regler er snudd på hodet siden den tid. Derfor blir det litt gjetning:

Jeg tror at echo, md og move bør stå på hver sin linje for at det skal fungere.

 

Takk for input! Skal teste det når jeg kommer hjem

Lenke til kommentar

 

 

 

Hvor skal jeg definere source directory og target directory?

 

 

Du passerer bare disse inn til skriptet (se mitt eksempel). Alternative varianter:

.\OrganizeFiles.ps1 -sourceDir .\usortert -targetDir .\sortert -dryRun
C:\OrganizeFiles.ps1 -sourceDir C:\usortert -targetDir C:\sortert -dryRun
C:\OrganizeFiles.ps1 -sourceDir "C:\en mappe\usortert" -targetDir "C:\en annen mappe\sortert" -dryRun
Endret av ahw_
Lenke til kommentar

 

 

 

 

Hvor skal jeg definere source directory og target directory?

 

 

Du passerer bare disse inn til skriptet (se mitt eksempel). Alternative varianter:

.\OrganizeFiles.ps1 -sourceDir .\usortert -targetDir .\sortert -dryRun
C:\OrganizeFiles.ps1 -sourceDir C:\usortert -targetDir C:\sortert -dryRun
C:\OrganizeFiles.ps1 -sourceDir "C:\en mappe\usortert" -targetDir "C:\en annen mappe\sortert" -dryRun

 

Takk for respons!

 

Denne feilmeldingen får jeg:

 

PS C:\windows\system32> cd c:\users\havnegata\desktop
PS C:\users\havnegata\desktop> .\orgvideo.ps1 .\usortert .\sortert -dryRun
WARNING: Performing a dry run; no changes will be made.
Get-ChildItem : A parameter cannot be found that matches parameter name 'File'.
At C:\users\havnegata\desktop\orgvideo.ps1:63 char:61
+ $sourceFiles = Get-ChildItem -Path $sourceDir -Recurse -File <<<<
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
PS C:\users\havnegata\desktop>
Lenke til kommentar

Hvilken versjon av Windows har du? Eller mer korrekt er er å spørre hvilken versjon av Powershell du har.

 

Inni Powershell-shell'et, kan du skrive inn følgende:

$PSVersionTable

Så skal du få noe som ligner dette:

PS C:\Users\Steffen> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

Jeg har versjon 4.0, og skriptet fungerer sannsynligvis ikke med en versjon eldre enn 3.0.

Endret av ahw_
Lenke til kommentar
  • 2 uker senere...

Må ta opp igjen denne tråden. Får denne feilmeldingen:

PS C:\users\havnegata\desktop> .\orgvideo.ps1 .\usortert .\sortert
WARNING: Skipping file: C:\users\havnegata\desktop\usortert\20150715_093950.mp4
PS C:\users\havnegata\desktop>
 
Hvorfor blir fila ekskludert?
Lenke til kommentar

 

Må ta opp igjen denne tråden. Får denne feilmeldingen:

PS C:\users\havnegata\desktop> .\orgvideo.ps1 .\usortert .\sortert
WARNING: Skipping file: C:\users\havnegata\desktop\usortert\20150715_093950.mp4
PS C:\users\havnegata\desktop>
 
Hvorfor blir fila ekskludert?

 

 

Hei igjen!

 

Fila ekskluderes fordi datoen ikke matcher formatet «xxxx-xx-xx» (altså med «-»).

Endret av ahw_
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...