gelöst Batch "dir B" nebeneinander statt untereinander mit , getrennt

Mitglied: plentm

plentm (Level 1)

14.11.2019 um 14:28 Uhr, 339 Aufrufe, 16 Kommentare

Hallo zusammen,
Mein erst Post und dann doch wahrscheinlich was einfaches. Leider reichen meine Kenntnisse dafür nicht aus, daher muss ich euch fragen.
Für einen Import von Artikel und die dazugehörigen Bildern benötige ich eine batch, welche mir eine csv Datei erstellt aus den Dateinamen der Bilder.
Die Artikelnummer sollte erst einen Timestamp beinhalten. Ablauf wäre halt, ich mache die Fotos und löse die Batch aus, danach werden Bilder und csv verschoben.
Danach kommt der nächste Artikel.
aussehen könnte sie so.
Artikel;Bild1;Bild2;Bild3;Bild4
20191114_141825;dsc1.jpg;dsc2.jpg;dsc3.jpg;dsc4.jpg
Ich denke es muss mit einer schleife gehen aber da hört es bei mir schon auf.
Hat wer vielleicht einen Ansatz?

Mein aktuelle Ansatz läuft mit
dir /B *.jpg > import.csv
, somit kann ich viele Artikel fotografieren, habe aber dann auch nur ein Bild vorhanden pro Artikel, weil die ja untereinander stehen.
Daher lieber den Ansatz oben, Fotoreihe machen und importieren lassen. Danach den nächsten Artikel.


Vielen Dank für eure Unterstützung.
Mitglied: erikro
14.11.2019 um 17:04 Uhr
Moin,

soll das ein csv pro Artikel werden oder eins für alle? Sind es immer die gleiche Anzahl Bilder oder variieren die?

Liebe Grüße

Erik
Mitglied: plentm
14.11.2019, aktualisiert um 17:31 Uhr
Mit mehreren Artikel wäre cool, aber man weiß ja nicht wann der neue Artikel anfängt.
Daher würde ich lieber einen Artikel immer haben wollen. Anzahl der Bilder können variieren bis zu 20. bei einen Artikel daher auch den timestamp als Artikelnummer, den würde ich dann in jtl dann ändern wollen nach dem import
Mitglied: rubberman
14.11.2019 um 21:40 Uhr
Probier mal was in der Art:
@echo off &setlocal
for /f %%i in ('wmic OS GET LocalDateTime /value') do for /f %%j in ("%%i") do set "%%j"
set "timestamp=%LocalDateTime:~0,8%_%LocalDateTime:~8,6%"
for /f %%i in ('dir /a-d /b *.jpg^|find /c /v ""') do set "count=%%i"
md "%timestamp%"

<nul >"%timestamp%.csv" (
  set /p "=Artikel"
  for /l %%i in (1 1 %count%) do set /p "=;Bild%%i"
  echo(
  set /p "=%timestamp%"
  for /f "delims=" %%i in ('dir /a-d /b *.jpg') do (
    set /p "=;%%i"
    >nul move "%%i" "%timestamp%\"
  )
)
>nul move "%timestamp%.csv" "%timestamp%\"
Steffen
Mitglied: plentm
15.11.2019 um 11:30 Uhr
Leider nicht ganz das ist mir zur Zeit auch alle sehr cryptisch und übersteigt mein Horizint.
Dein Script erzeugt einen neuen Ordner und darin sind die sind die Bilder sowie die csv.
Der Name der csv muss ich gleich bleiben, damit JTL die immer importieren kann.

Der Inhalt der Datei sieht nun wie folgt aus.

Artikel
C:\Intel\mhl\Bilder import>set /p "=;Bild1" 
;Bild1
C:\Intel\mhl\Bilder import>set /p "=;Bild2" 
;Bild2
C:\Intel\mhl\Bilder import>set /p "=;Bild3" 
;Bild3
C:\Intel\mhl\Bilder import>set /p "=;Bild4" 
;Bild4
C:\Intel\mhl\Bilder import>set /p "=;Bild5" 
;Bild5
C:\Intel\mhl\Bilder import>set /p "=;Bild6" 
;Bild6
C:\Intel\mhl\Bilder import>set /p "=;Bild7" 
;Bild7
20191115_112636
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05039.JPG"  
 move "DSC05039.JPG" "20191115_112636\" 1>nul 
) 
;DSC05039.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05040.JPG"  
 move "DSC05040.JPG" "20191115_112636\" 1>nul 
) 
;DSC05040.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05041.JPG"  
 move "DSC05041.JPG" "20191115_112636\" 1>nul 
) 
;DSC05041.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05042.JPG"  
 move "DSC05042.JPG" "20191115_112636\" 1>nul 
) 
;DSC05042.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05043.JPG"  
 move "DSC05043.JPG" "20191115_112636\" 1>nul 
) 
;DSC05043.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05044.JPG"  
 move "DSC05044.JPG" "20191115_112636\" 1>nul 
) 
;DSC05044.JPG
C:\Intel\mhl\Bilder import>(
set /p "=;DSC05045.JPG"  
 move "DSC05045.JPG" "20191115_112636\" 1>nul 
) 
;DSC05045.JPG
Mitglied: erikro
15.11.2019 um 11:45 Uhr
Moin,

Zitat von plentm:

Mit mehreren Artikel wäre cool, aber man weiß ja nicht wann der neue Artikel anfängt.

??? Woran unterscheidest Du denn dann, welche Bilder zu welchem Artikel gehören?

Daher würde ich lieber einen Artikel immer haben wollen. Anzahl der Bilder können variieren bis zu 20. bei einen Artikel daher auch den timestamp als Artikelnummer,

??? Die Logik verstehe ich nicht.

Liebe Grüße

Erik
Mitglied: plentm
15.11.2019 um 12:12 Uhr
Ablauf wäre wie folgt. Ich mache z.B. 6 Fotos, die landen mit dem Dateinamen der Cam in einem Ordner, wo auch die batch liegt.
Nachdem 1 Artikel fotografiert wurde führe ich die batch aus, die mir dann, wie im Post 1, eine CSV Datei erzeugen sollte. Liegt alles im gleichen Ordner. Sobald die batch ausgeführt wurde und die csv erstellt wurde wird am Ende der batch noch der Importer ausgeführt.
sobald das durchgelaufen ist, können die Bilder und csv im "_Archiv Ordner" verschoben werden. Die csv bekommt am Ende des Dateinamens noch YYYYMMDD angehängt.
Dann ist der Ordner wieder leer bis auf batch und _Archiv und der nächste Artikel kann fotografiert werden.

Meine alte Vorgehensweise war mit dir /B. Dabei konnte ich viele Artikel importieren, jedoch nur mit einem Foto. Um viele Artikel zu importieren mit mehreren Bilder müsste ja wissen, wann bei den Bildern der neue Artikel anfängt. Da müsste ich an der Cam schauen, ob ich per Knopf die Dateien anders nennen kann. Denke aber der Aufwand wäre zu groß, dann lieber nach jeden Artikel die batch ausführen.

Mein alter Stand sieht wie folgt aus. Da Frage ich auch noch die 20 ab, da die Bilder alle mit 2019 beginnen.

@echo off
rem Variablen setzen für Datum und Zeit für Ordner und Dateiangaben
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set hr=%time:~0,2%
if "%hr:~0,1%" == " " SET hr=0%hr:~1,1%
set min=%time:~3,2%
set sek=%time:~6,2%


rem prüfen ob _archiv\ vorhanden ist, ansonsten erstellen
 If not exist "./_archiv" (
 mkdir "./_archiv"
)


rem dir liste erstellen und in JTL importieren mit Dateinamen.
dir /B 20* > import.csv
"C:\Program Files (x86)\JTL-Software\JTL-wawi-ameise.exe" --server=XXXXXX --database=XXXXXX --dbuser=XXXXX --dbpass=XXXXXXXX --templateid=XXXX --inputfile=import.csv
rem csv und Bilder verschieben 
move .\20* .\_archiv\
move .\import.csv .\_archiv\%YYYY%%MM%%DD%_%hr%%min%%sek%.csv
Mitglied: erikro
15.11.2019, aktualisiert um 12:53 Uhr
Moin,

Zitat von plentm:
Ablauf wäre wie folgt. Ich mache z.B. 6 Fotos, die landen mit dem Dateinamen der Cam in einem Ordner, wo auch die batch liegt.
Nachdem 1 Artikel fotografiert wurde führe ich die batch aus, die mir dann, wie im Post 1, eine CSV Datei erzeugen sollte. Liegt alles im gleichen Ordner. Sobald die batch ausgeführt wurde und die csv erstellt wurde wird am Ende der batch noch der Importer ausgeführt.
sobald das durchgelaufen ist, können die Bilder und csv im "_Archiv Ordner" verschoben werden. Die csv bekommt am Ende des Dateinamens noch YYYYMMDD angehängt.
Dann ist der Ordner wieder leer bis auf batch und _Archiv und der nächste Artikel kann fotografiert werden.

So, nun ist das Problem klar. Hier das Powershell-Skript, das das löst:

$timestamp = get-date -Format "yyMMdd_hhmmss"
$files = Get-ChildItem *.jpg
$csv_object = New-Object PSObject
$csv_object | Add-Member NoteProperty "Artikel" "$timestamp"
$i = 1
foreach($file in $files) {

    $csv_object | Add-Member NoteProperty "Bild$i" "$($file.name)"
    $i++

}

$csv_object | Export-Csv standardname.csv -NoTypeInformation -delimiter ";" -Encoding utf8

importer.exe standardname.csv # Oder wie auch immer der importer aufgerufen wird.
move-item * -Destination "Pfad zum Archivordner" -exclude name_des_skripts.ps1
hth

Erik
Mitglied: rubberman
15.11.2019 um 13:13 Uhr
Der Name der csv muss ich gleich bleiben
Zeile 7
<nul >"irgendeinimmergleichername.csv" (
Der Inhalt der Datei sieht nun wie folgt aus.
Sicher nur dann wenn du das Script geändert hast und in der ersten Zeile ein ECHO ON statt ECHO OFF steht.

Steffen
Mitglied: plentm
15.11.2019, aktualisiert um 14:14 Uhr
An deinem Script habe ich nichts mehr geändert, einfach nur copy paste. Habe es gerade noch mal gemacht, aber die ausgabe der CSV ist immer gleich. oder ich mache Grundlegend was verkehrt, dass schließe ich mal nicht aus

@ Erik: Danke für dein Script, so hatte ich mir das ungefähr vorgestellt. Wenn jetzt in der csv die "" entfernt wären und die Datei vor dem Verschieben umbenannt wird mit Datum am Ende, also import_20191115_141322.csv wäre das schon mal echt super. Kann man beim verschieben auch sagen, dass er bestehende gleiche Dateien überschreiben soll? Hatte vorhin das Problem, dass er nicht verschoben hat, weil schon vorhanden.

Dann müsste ich nur noch gucken, wie ich das per Doppelclick ausführe, das war immer schön an der batch Datei.

Gruß
Mitglied: erikro
15.11.2019 um 14:29 Uhr
Moin,

klar geht das.

$timestamp = get-date -Format "yyMMdd_hhmmss"
$files = Get-ChildItem *.jpg
$csv_object = New-Object PSObject
$csv_object | Add-Member NoteProperty "Artikel" "$timestamp"
$i = 1
foreach($file in $files) {

    $csv_object | Add-Member NoteProperty "Bild$i" "$($file.name)"
    $i++

}

$csv_object | Export-Csv import.csv -NoTypeInformation -delimiter ";" -Encoding utf8

importer.exe standardname.csv # Oder wie auch immer der importer aufgerufen wird.
$newname = "import_" + $timestamp + ".csv"
rename-item import.csv $newname
move-item * -Destination "Pfad zum Archivordner" -force
hth

Erik
Mitglied: plentm
15.11.2019, aktualisiert um 14:45 Uhr
Wird gleich mal ausgetestet, wenn die ps nicht immer versuchen würde den system32 zu verschieben
Hatte es mit dem doppelklick versucht und Standardprogramm
Pfad: C:\Windows\System32\WindowsPowerShell\v1.0\powerShell.exe

nur leider nimmt er dann die Pfade wo die ps.exe liegt.
Eigentlich müsste ich ja nur mit relativen Pfaden arbeiten, also da wo sich die ps befindet.
Geht das auch?
Sorry, ich muss mir echt überlegen ps mehr zu lernen, scheint ja recht mächtig zu sein.

Gruß und besten Dank
Mitglied: plentm
15.11.2019 um 15:13 Uhr
Ok, das per Doppelklick scheint ja soweit zu klappen und die Policy steht auf "Unrestricted"

der Fehler in der console ist
Export-Csv : Der Zugriff auf den Pfad "C:\WINDOWS\system32\import.csv" wurde verweigert.
Kann das denn was mit den Pfaden zu tun haben, weil das Script jetzt per "öffnet mit" auf Powershell bezogen ist?
Wenn ich das wieder auf Notepad ändere und rechtsklick "Mit Powershell ausführen" klicke klappt alles wieder soweit.

Gruß und Danke für deine Unterstützung.
Mitglied: erikro
15.11.2019 um 15:45 Uhr
Zitat von plentm:

Ok, das per Doppelklick scheint ja soweit zu klappen und die Policy steht auf "Unrestricted"

der Fehler in der console ist
Export-Csv : Der Zugriff auf den Pfad "C:\WINDOWS\system32\import.csv" wurde verweigert.
> 

Da soll die Datei ja auch nicht hin. Am Einfachsten ist es, wenn Du Dir eine PS-Konsole aufmachst, dort dann

cd x:\pfad_auf_dein_Verzeichnis
.\name_des_skripts.ps1
eintippst. Dann löpt dat.

hth

Erik
Mitglied: plentm
15.11.2019 um 17:38 Uhr
Ok, das muss ich Sonntag mal testen. Wenn nicht, dann melde ich mich noch mal.
Vielen Dank
Mitglied: plentm
15.11.2019 um 20:31 Uhr
habs gerade erst gerafft, ist ja wie linux mit ./script

Aber das war nicht ganz so gemeint von mir. Wenn ich die Datei Import.ps1 habe, dann kann ich ja nicht einfach doppelklick machen, da sich dann der Editor öffnet. Ein Rechtsklick ausführen mit ps geht soweit.
Nun habe ich gelesen, wenn man Rechtsklick>eigenschaften>öffnet mit> und dann ps aussucht, dann geht es auch mit doppelklick, aber dann befindet er sich in
C:\Windows\System32\WindowsPowerShell\v1.0\powerShell.exe
und führ dort den Code aus.
Ich habs erst mal mit absoluten Pfad gemacht, das geht soweit. Wüsste jetzt nicht, wie er sich den Pfad merken könnte, wo die Datei ausgeführt wird.
$csv_object | Export-Csv C:\mhl\Bilder_import\import.csv -NoTypeInformation -delimiter ";" -Encoding utf8
Titel: Batch "dir B" nebeneinander statt untereinander mit , getrennt
Content-ID: 515147
Art des Inhalts: Frage
Ausgedruckt am: 20.01.2020 um 16:52:33 Uhr
URL: https://administrator.de/contentid/515147