plentm
Goto Top

Batch "dir B" nebeneinander statt untereinander mit , getrennt

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.

Content-Key: 515147

Url: https://administrator.de/contentid/515147

Printed on: April 26, 2024 at 05:04 o'clock

Member: erikro
erikro Nov 14, 2019 at 16:04:13 (UTC)
Goto Top
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
Member: plentm
plentm Nov 14, 2019 updated at 16:31:04 (UTC)
Goto Top
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
Member: rubberman
rubberman Nov 14, 2019 at 20:40:54 (UTC)
Goto Top
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
Member: plentm
plentm Nov 15, 2019 at 10:30:26 (UTC)
Goto Top
Leider nicht ganz face-smile 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
Member: erikro
erikro Nov 15, 2019 at 10:45:33 (UTC)
Goto Top
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
Member: plentm
plentm Nov 15, 2019 at 11:12:22 (UTC)
Goto Top
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
Member: erikro
erikro Nov 15, 2019 updated at 11:53:15 (UTC)
Goto Top
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
Member: rubberman
rubberman Nov 15, 2019 at 12:13:58 (UTC)
Goto Top
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
Member: plentm
plentm Nov 15, 2019 updated at 13:14:22 (UTC)
Goto Top
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 face-smile

@ 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ß
Member: erikro
erikro Nov 15, 2019 at 13:29:14 (UTC)
Goto Top
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
Member: plentm
plentm Nov 15, 2019 updated at 13:45:53 (UTC)
Goto Top
Wird gleich mal ausgetestet, wenn die ps nicht immer versuchen würde den system32 zu verschiebenface-smile
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
Member: erikro
erikro Nov 15, 2019 at 13:56:56 (UTC)
Goto Top
Member: plentm
plentm Nov 15, 2019 at 14:13:57 (UTC)
Goto Top
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.
Member: erikro
erikro Nov 15, 2019 at 14:45:36 (UTC)
Goto Top
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. face-wink 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
Member: plentm
plentm Nov 15, 2019 at 16:38:15 (UTC)
Goto Top
Ok, das muss ich Sonntag mal testen. Wenn nicht, dann melde ich mich noch mal.
Vielen Dank
Member: plentm
plentm Nov 15, 2019 at 19:31:30 (UTC)
Goto Top
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