Zdjęcie w tle
majlu11

majlu11

Debiutant
  • 2wpisy
  • 11komentarzy
Witam

Jakiś czas tem prosiłem was o pomoc w doborze programu do importowania zdjęć. Udało mi sie napisać skryp w poweshell który spełnia wszystkie moje oczekiwania. Ale mam problem z jego uruchamianiem. Chciałbym aby startował on jak uruchomienie normalnego pliku. zrobiłem wg instrukcji
Utworz skrot,
W skrocie --> Wlasciwosci
i w elemencie docelowym dopisac przed sciezka: powershell.exe -ExecutionPolicy Bypass -File .........

i czarne okno pojawia sie na 1s i tyle
Z pozycji powershella skrypt sie uruchamia

Oto skrypt:

# Ustawienia
$destinationPath = "C:\Zdjecia" # Zmień na odpowiednią ścieżkę docelową

# Funkcja do znalezienia karty SD
function Get-SDCardPath {
   $drives = Get-PSDrive -PSProvider FileSystem
   foreach ($drive in $drives) {
       $dcimPath = Join-Path -Path $drive.Root -ChildPath "DCIM"
       if (Test-Path $dcimPath) {
           return $drive.Root
       }
   }
   return $null
}

# Funkcja do importowania zdjęć
function Import-Photos {
   param (
       [string]$source,
       [string]$destination
   )

# Sprawdzenie, czy źródło istnieje
   if (-Not (Test-Path $source)) {
       Write-Host "Źródło nie istnieje: $source"
       return
   }

# Pobranie zdjęć
   $photos = Get-ChildItem -Path $source -Include *.jpg, *.jpeg, *.png -Recurse

if ($photos.Count -eq 0) {
       Write-Host "Brak zdjęć do zaimportowania."
       return
   }

# Wyświetlenie zdjęć do zaimportowania
   Write-Host "Zdjęcia do zaimportowania:"
   $photos | ForEach-Object { Write-Host $_.FullName }

# Zapytanie użytkownika
 # $userResponse = Read-Host "Czy chcesz zaimportować te zdjęcia? (T/N)"
 # if ($userResponse -ne 'T') {
   #   Write-Host "Importowanie anulowane."
     # return
 # }

# Importowanie zdjęć
   foreach ($photo in $photos) {
       $dateTaken = (Get-Date $photo.LastWriteTime).ToString("yyyy-MM-dd")
       $folderPath = Join-Path -Path $destination -ChildPath $dateTaken

# Utworzenie folderu, jeśli nie istnieje
       if (-Not (Test-Path $folderPath)) {
           New-Item -ItemType Directory -Path $folderPath | Out-Null
       }

# Generowanie unikalnej nazwy pliku
       $newFileName = [System.IO.Path]::GetFileNameWithoutExtension($photo.FullName) + "_" + [guid]::NewGuid().ToString() + [System.IO.Path]::GetExtension($photo.FullName)
       $newFilePath = Join-Path -Path $folderPath -ChildPath $newFileName

# Kopiowanie pliku
       Copy-Item -Path $photo.FullName -Destination $newFilePath
       Write-Host "Skopiowano: $newFilePath"
   }

Write-Host "Importowanie zakończone."
}

# Znalezienie karty SD
$sdCardPath = Get-SDCardPath

if ($sdCardPath) {
   Write-Host "Znaleziono kartę SD w: $sdCardPath"
   Import-Photos -source (Join-Path -Path $sdCardPath -ChildPath "DCIM") -destination $destinationPath
} else {
   Write-Host "Nie znaleziono karty SD."
}

Start-Process explorer.exe $destinationFolder

#programowanie #pracbaza
koszotorobur

@majlu11 - próbowałeś tak:

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -ExecutionPolicy Bypass"

majlu11

@koszotorobur wkleic to do skryptu?

koszotorobur

@majlu11 - wkleić do skrótu.

entropy_

@majlu11 zapisz plik w jakimś folderze, naciśnij prawym przyciskiem na folderze, otwórz tu terminal, włącz skrypt z terminala i powiedz jaki bład jest napisany

majlu11

@entropy_ z terminala działa mi normalnie

entropy_

@majlu11 nie rozumiem, destination i source masz zawsze rózne czy takie same?

Bo jak takie same to włączaj skrypt a nie skrót

majlu11

Dziekuje wszystkim za pomoc. Udało się wszystko działa. A co sie okazało ze na komputerze jest windows powershell i powershell 7 na którym mi wszystko działało. Ten drugi jednak miał inna scieżke dostępu. po zmianie scieżki na "C:\Program Files\PowerShell\7\pwsh.exe" -ExecutionPolicy Bypass wszystko zaczęło chulać.


Jeszcze raz dzięki za dobre rady.

Zaloguj się aby komentować

Witam
Mam problem z importowaniem zdjęć na komputer z aparatów. Ale od początku.
Pracuje w firmie gdzie do dokumentacji robimy kilka zdjęć aparatem(każdy ma swój) i później zgrywamy to na komputer szefa.
Starsze aparaty były wykrywane przez Windowsa jako aparat i poprostu klikało się prawym przyciskiem myszy na nazwę aparatu w eksploratorze plików i pojawiało się importuj. I komputer sam tworzył podfolderze z datą. Działało to dobrze. Odkąd pojawiły się nowe aparaty w firmie zaczął się problem. Po podpięciu do komputera nie wykrywa ich jako aparat tylko pamięć masową. I można importować jedynie przez aplikację zdjęcia co średnio działa… albo poprostu tworzyć folder z aktualną data i kopiować. Tu jest drugi problem bo aparaty dublują nazwy i już się zdążyło ze ktoś zastąpił zdjęcia o takiej samej nazwie…
Znacie jakiś prosty program który importowałby zdjęcia z karty SD tworząc od razu podfolder z datą?
Jeżeli to nie ten dział to przepraszam.

#programowanie #techpigulka #pracbaza #fotografia
majlu11

ChatGPT zaproponował taki skrypt, jak będę miał dostęp do apartow to go przetestuję.

Myślicie że wszystko jest tutaj ok czy coś wymaga poprawy?

Jeszcze raz dziękuję za zainstalowanie 😉

# Ustawienia

$destinationPath = "C:\Users\TwojaNazwaUżytkownika\Pictures\ImportowaneZdjęcia" # Ścieżka docelowa


# Znajdź dysk z kartą SD

$sdCard = Get-WmiObject Win32_DiskDrive | Where-Object { $_.MediaType -eq "Removable Media" }


if ($sdCard) {

\# Uzyskaj literę dysku<br />

$sdCardLetter = \(Get\-WmiObject Win32\_LogicalDisk | Where\-Object \{ $\_\.DeviceID \-eq $sdCard\.DeviceID \}\)\.DeviceID<br />

\# Pobierz wszystkie pliki zdjęć z karty SD<br />

$images = Get\-ChildItem \-Path "$sdCardLetter\\\*" \-Include \*\.jpg, \*\.jpeg, \*\.png \-Recurse<br />

foreach \($image in $images\) \{<br />

    \# Odczytaj datę utworzenia zdjęcia<br />

    $creationDate = \(Get\-Item $image\.FullName\)\.CreationTime<br />

    \# Ustal nazwę folderu na podstawie daty<br />

    $dateFolder = $creationDate\.ToString\("yyyy\-MM\-dd"\)<br />

    $finalDestinationPath = Join\-Path \-Path $destinationPath \-ChildPath $dateFolder<br />

    \# Utwórz folder docelowy, jeśli nie istnieje<br />

    if \(\-not \(Test\-Path \-Path $finalDestinationPath\)\) \{<br />

        New\-Item \-ItemType Directory \-Path $finalDestinationPath<br />

    \}<br />

    \# Ustal nową nazwę pliku, aby uniknąć nadpisywania<br />

    $newFileName = "\{0\}\_\{1:yyyy\-MM\-dd\_HH\-mm\-ss\}\{2\}" \-f $image\.BaseName, $creationDate, $image\.Extension<br />

    $newFilePath = Join\-Path \-Path $finalDestinationPath \-ChildPath $newFileName<br />

    \# Skopiuj zdjęcie do odpowiedniego folderu z nową nazwą<br />

    Copy\-Item \-Path $image\.FullName \-Destination $newFilePath \-Force<br />

\}<br />

Write\-Host "Zdjęcia zostały zaimportowane do: $destinationPath"<br />

} else {

Write\-Host "Nie znaleziono karty SD\."<br />

}

koszotorobur

@majlu11 - jak nie przetestujesz to się nie dowiesz

majlu11

Panowie skrypt udało mi sie dostosowac w weekend i spełnia wszystkie moje funkcje. Utworzyłem skrót skryptu i we własciwosciach/element docelowy dodałem powershell -ExecutionPolicy Bypass -File (i tutaj jest sciezka mojego skryptu). Ale skrypt nie uruchamia sie, pojawia sie czarne okno na sekunde i nic. Z pozycji powershell skrypt działa.

Zaznaczałem uduchom jako administrator. Macie może jakiś pomysł?

Zaloguj się aby komentować