Powershell: Copiando as Imagens da Câmera do iPhone para o Computador, separado das capturas de tela, etc.

0

Eu quero semi-automatizar a cópia e categorização de arquivos DCIM do meu iPhone para o meu computador, mantendo imagens de câmeras "relacionadas" juntas e separadas de capturas de tela, jpegs baixados, gifs, mpegs, pngs, etc.

No meu iPhone eu tenho um monte de imagens baixadas (do Pinterest, Tumblr, etc). Eu também tenho um monte de fotos relacionadas jpg / mp4 tiradas com a câmera do iPhone que estão em pares relacionados, um seguindo o outro na ordem do nome do arquivo. Aparentemente, a câmera do iPhone grava uma imagem jpeg e um filme MP4 com vários quadros para cada foto tirada. As imagens baixadas são apenas jpegs simples, gifs, mp4, etc.

Eu gostaria que o script residisse no computador local e fosse executado manualmente depois que o iPhone fosse montado.

Os caminhos da imagem do iPhone são: 'mtp: // iPhone / Armazenamento Interno / DCIM / 291APPLE de Scottc', 'mtp: // iPhone / Armazenamento Interno / DCIM / 292APPLE de Scottc', 'mtp: // Scottc iPhone / armazenamento interno / DCIM / 293APPLE ', etc.

Eu não tenho controle sobre os nomes dos subdiretórios (como 291APPLE, 292APPLE, 293APPLE , etc., mas eles sempre começam com um número de 3 dígitos (aparentemente aleatório) e sempre terminam em " APPLE ". Pode haver um ou dez. Depende apenas do iOS e do número de arquivos. Os subdiretórios são somente de leitura, mas os arquivos em si são de leitura / gravação, portanto, podem ser excluídos mais tarde.

Então, eu preciso trabalhar com todos os arquivos de forma recursiva até 'mtp: // iPhone / armazenamento interno / DCIM /' do Scottc.

A lista de diretórios em cada subpasta do iPhone é semelhante a esta:

*image001.jpg* <-- downloaded *image002.jpg* <-- downloaded *image003.jpg* <-- camera image a *image004.mp4* <-- camera image b *image005.jpg* <-- downloaded *image006.jpg* <-- downloaded *image007.jpg* <-- downloaded *image008.jpg* <-- downloaded *image009.jpg* <-- camera image a *image010.mp4* <-- camera image b *image011.jpg* <-- downloaded

Portanto, os arquivos 003 e 004 estão relacionados e os arquivos 009 e 010 estão relacionados. Todos os arquivos no iPhone / DCIM / * da Scottc têm nomes exclusivos.

Eu gostaria de copiar apenas as imagens relacionadas para o diretório A e as imagens restantes (downloads, que podem ser de qualquer tipo jpg, gif, mp4, etc.) para o Diretório B.

Alguém pode ajudar com a lógica e o código do Powershell que tornariam isso possível? Eu realmente não tenho ideia de como fazer isso. Talvez exista uma maneira melhor ou um utilitário que alguém já escreveu? Se assim for, não consegui encontrá-lo e lidar com centenas de imagens de cada vez é realmente entediante. Esta parece ser a aplicação perfeita para o Powershell.

Eu acho que eu preciso percorrer os arquivos, identificar o primeiro arquivo * .mp4, colocar o nome do arquivo em uma variável, copiar o arquivo * .mp4 no diretório A e subtrair o valor 1 da variável para corresponder ao nome de arquivo * .jpg relacionado anterior em ordem alfabética e copiá-lo para o Diretório A.

Enxaguar e repetir.

Copie os arquivos não relacionados restantes (de qualquer tipo) para o Diretório B.

Então, no final, eu tenho a seguinte estrutura de diretórios:

On the iPhone:  

(leave the original files as is)  

Directory A  

image003.jpg    <-- camera image a  
image004.mp4    <-- camera image b  
image009.jpg    <-- camera image a  
image010.mp4    <-- camera image b  

Directory B  

image001.jpg    <-- downloaded  
image002.jpg    <-- downloaded  
image005.jpg    <-- downloaded  
image006.jpg    <-- downloaded  
image007.jpg    <-- downloaded  
image008.jpg    <-- downloaded  
image011.jpg    <-- downloaded 

Finalmente, pergunte ao usuário se ele deseja excluir os originais do iPhone (eu posso lidar com essa parte, eu acho), mas não os diretórios do iPhone (o problema de permissões mencionado acima ... o iOS cuida da estrutura do diretório). / p>

Uma pegadinha, eu acho, é que um filme baixado terminado em * .mp4 será combinado com um arquivo * .jpg não relacionado que foi baixado anteriormente. A menos que alguém tenha uma maneira elegante de lidar com isso. Eu posso viver com essa pequena limitação. Notei que os arquivos jpg / mp4 relacionados têm o mesmo timestamp hh: ss, se isso ajudar. As imagens / filmes / gifs transferidos nunca correspondem ao tempo. Talvez a correspondência dos timestamps seja mais fácil? Não faço ideia de como conseguir isso.

Onde estou realmente confuso é o manuseio da (s) variável (s) de nome de arquivo, a lógica matemática -1 ao trabalhar com nomes de arquivos e como manipular os nomes de arquivos restantes (em uma matriz ou por iteração ?) A cópia, movimento, correspondência de nomes, etc. Acho que posso resolver através de tentativa e erro - mas fique à vontade para elaborar. O que alguns podem fazer na mosca me leva horas, muitas vezes terminando em fracasso e frustração: - (

Alguém pode ajudar? Minhas habilidades com o Powershell estão no nível 3 do capítulo, então estou com muita dificuldade.

    
por Scott 30.06.2017 / 18:14

2 respostas

0

Experimente e mantenha-nos informados sobre se funciona ou não:

Editar: Esqueci de pesquisar em cada diretório. Deve ser corrigido agora.

$directoryA = "%userprofile%\Pictures\Directory A"
$directoryB = "%userprofile%\Pictures\Directory B"
$items = Get-ChildItem ".\image*"  -Recurse | ForEach-Object { if (!($_.PSIsContainer)) { $_}}
$i = 0
$mp4s = @()
$associatedImgs = @()
 ForEach($item in $items) {
    If(($items[$items.IndexOf($item)].Extension).Equals(".mp4")) {
        $mp4s += $i
        $associatedImgs += $i - 1
        }
    $i += 1
}

ForEach($mp4 in $mp4s) {
    Copy-Item -Path $items[$mp4].FullName -Destination $directoryA -Force -PassThru -Verbose
    Copy-Item -Path $items[$mp4 - 1].FullName -Destination $directoryA -Force -PassThru -Verbose

}
ForEach($item in $items) {
    If($mp4s.Contains($items.IndexOf($item))){

    } ElseIf($associatedImgs.Contains($items.IndexOf($item))) {

    } Else {
        Copy-Item -Path $items[$item].FullName -Destination $directoryB -Force -PassThru -Verbose

    }
}
    
por 30.06.2017 / 19:22
0

Se o tempo de criação dos pares .mp4 / .jpg for confiável,
você pode tentar agrupar os arquivos por esta propriedade:

Get-ChildItem -Recurse -include '*.htm','*.ps1'|
  Group-Object Creationtime|
    ForEach-Object {If($_.Group.Count -eq 2){$_.Group.Fullname;"---"}}

Isso só gerará pares de dois tempos de correspondência para uma verificação.

    
por 01.07.2017 / 01:47