sugram
Goto Top

Powershell: dir ausgabe an copy Befehl weiterleiten

Hallo

Nachdem hier ja immer wieder geschrieben wird, Batch ist tot, habe ich mich auch mal an Powershell gewagt.
Ich versuche aktuell meine Batch in Powershell zum laufen zu bringen.
Dank Tante google, habe ich hier auch schon kleine Erfolge.
Aber wie ich das mit der for Schleife in der Powershell lösen soll, ist mir immer noch ein Rätzel.
Es wäre echt klasse wenn mir hier einer ein Tipp geben könnte.


Batch

@echo on


color 0b

:Top
cls
set VERZ=

@Echo.
@Echo.
@Echo.
@Echo *********************
@Echo *                   *
@Echo * Station auswählen *
@Echo *    [1] ST30       *
@Echo *    [2] ST35       *
@Echo *                   *
@Echo *********************


set /p Auswahl= Bitte Linie auswaehlen: 

if %Auswahl%==1 goto ST30
if %Auswahl%==2 goto ST35



:ST30
set VERZ=ST030

set /p BC-ST30= Bitte Barcode eingeben: 

for /F "TOKENS=1-10 DELIMS=\" %%a in ('"dir /b /s c:\z\Daten\%VERZ%\Images\Data\%BC-ST30%*"') do (copy %%a\%%b\%%c\%%d\%%e\%%f\%%g\%%h\%%i c:\tmp\%%e\%%f\%%g\%%h\%%i)  

goto Top


:ST35

set VERZ=ST035

set /p BC-ST35= Bitte Barcode eingeben: 


for /F "TOKENS=1-10 DELIMS=\" %%a in ('"dir /b /s c:\z\Daten\%VERZ%\Images\Data\%BC-ST35%*"') do (copy %%a\%%b\%%c\%%d\%%e\%%f\%%g\%%h\%%i c:\Baumann\%%e\%%f\%%g\%%h\%%i)  

goto Top


Bisher habe ich das in Powershell hinbekommen

function Show-Menu
{
     param (
           [string]$Title = 'Station auswählen'  
     )
     cls
     Write-Host "================ $Title ================"  
    
     Write-Host "                 1: '1' ST30"  
     Write-Host "                 2: '2' ST35"  
     Write-Host "             Q: Press 'Q' to quit."  
     Write-Host ""  
     Write-Host ""  
     }

do

{
     Show-Menu
     $input = Read-Host "Bitte auswählen"  
     switch ($input)
     {
           '1' {  
                cls
                'ST30 ausgewählt'  
                ''  
                $VERZ = "ST030"  

                $Barcode30 = Read-Host "Bitte Barcode eingeben "  
                Write-Host "Barcode: " $Barcode30  
                $Datei = dir -Recurse c:\z\Daten\$VERZ\Images\Data\$Barcode30*
                Write-Host "VERZEICHNISS:  " $Datei  
            } '2' {  
                cls
                'ST35 ausgewählt'  
                ''  
                $VERZ = "ST035"  

                $Barcode = Read-Host "Bitte Barcode eingeben "  
                Write-Host "Barcode: " $Barcode  
           } 'q' {  
                return
           }
     }
     pause
}
until ($input -eq 'q')  

Content-ID: 496729

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

Ausgedruckt am: 17.11.2024 um 19:11 Uhr

emeriks
emeriks 20.09.2019 um 08:26:18 Uhr
Goto Top
Hi,
wenn Du schon auf PS umsteigst, dann solltest Du auch deren "native" Kommandos benutzen.

dir => Get-CildItem
copy => Copy-Item

E.
Lochkartenstanzer
Lochkartenstanzer 20.09.2019 um 08:34:31 Uhr
Goto Top
Zitat von @emeriks:

Hi,
wenn Du schon auf PS umsteigst, dann solltest Du auch deren "native" Kommandos benutzen.

dir => Get-CildItem
copy => Copy-Item


dir und copy sind nur aliase der jeweiligen Kommandos und können i.d.R. daher genauso verwendet werden.

Aber wenn man lernen will, ist es natürlich besser die "Urform" mit den jeweiligen Parametern zu nutzen.

lks
emeriks
emeriks 20.09.2019 aktualisiert um 08:48:20 Uhr
Goto Top
Hi,
Zitat von @Lochkartenstanzer:
dir und copy sind nur aliase der jeweiligen Kommandos und können i.d.R. daher genauso verwendet werden.
Ja korrekt. Aber wie Du selbst schreibst: Wenn man es neu lernen will, dann gleich richtig. Und ich behaupte mal, wenn man im Internet nach Hilfe sucht, insbsondere die Original-Doku von Mutti, dann kommt man mit den Namen der CmdLet schneller voran.
sugram
sugram 20.09.2019 aktualisiert um 09:00:24 Uhr
Goto Top
Ja, das mit dem Get_Childitem habe ich nun auch schon gefunden.
Bisher habe ich das so, daß mir dann zumindest die Dateien dann anzeigt.

Get-Childitem "c:\z\Daten\$VERZ\Images\Data\$Barcode30*" -Recurse | ForEach-Object {$_.FullName}  

Aber wie ich dann hier das mit dem for verschachtle, muss ich noch herausfinden.
Und wenn er 2 Dateien findet, diese dann kopiert, mal ganz zu schweigen face-wink

Wie immer
Aller Anfang ist schwer.
140913
140913 20.09.2019 aktualisiert um 09:10:06 Uhr
Goto Top
Foreach ist hier überflüssig, die Property Path bzw. Fullname von Get-childitem wird in der Pipeline von Copy-Item direkt als Input verwendet.
Get-Childitem "c:\z\Daten\$VERZ\Images\Data\$Barcode30*" -Recurse | Copy-Item -Destination "d:\Ziel"  
Das siehst du in der Doku an der Beschreibung zum Parameter -Path
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Accept pipeline input: True (ByPropertyName, ByValue)
sugram
sugram 20.09.2019 aktualisiert um 09:55:14 Uhr
Goto Top
Zitat von @140913:

Foreach ist hier überflüssig, die Property Path bzw. Fullname von Get-childitem wird in der Pipeline von Copy-Item direkt als Input verwendet.
> Get-Childitem "c:\z\Daten\$VERZ\Images\Data\$Barcode30*" -Recurse | Copy-Item -Destination "d:\Ziel"  
> 
Das siehst du in der Doku an der Beschreibung zum Parameter -Path
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Accept pipeline input: True (ByPropertyName, ByValue)

Danke hier für den Input face-smile

Hatte noch vergessen das hinter dem \Data\ noch unterverzeichnisse existieren.
Also kann es sein, das mit dem Suchstring 2 Dateien gefunden werden.
Die dann auch den selben Namen haben.
Diese sollen dann daher in den dementsprechenden Verzeichnisse kopiert werden.
Daher habe ich das ja auch mit der Batch das mit den Tokens gelöst, damit ich in dem richtigen Verzeichnis dann kopiere.

Mit der Lösung von dir, kopiert er nur eine einzige Datei.

Ich werd mal weiter rumprobieren face-smile
140913
Lösung 140913 20.09.2019 aktualisiert um 10:15:40 Uhr
Goto Top
Mit der Lösung von dir, kopiert er nur eine einzige Datei.
Wenn in den Ordnern darunter nur eine Datei liegt logisch, wenn es mehrere mit gleichem Namen sind funktioniert das natürlich nicht denn es ist ja nur ein Zirlordner. Außerem war das nur ein Beispiel das dir verdeutlichen sollte wie man das normalerweise handhabt.

Für deinen Fall :
$path = "c:\z\Daten\$VERZ"  
Get-Childitem "$path\Images\Data" -Filter "$Barcode30*" -Recurse | %{  
    $dest = $_.DirectoryName -replace [regex]::escape($path),"c:\Baumann"  
    if (!(Test-Path $dest)){md $dest -Force | out-null}
    $_ | Copy-Item -Destination $dest -verbose
}
Nicht nur probieren, erst viel viel Doku lesen dann Beispiele machen dann gleich richtig umsetzen.
Mit rum probieren und raten verbrätst du nur unnötig Zeit und hinterher hast du nur vielfach Lücken.

Viel Spaß beim Lernen ich bin jetzt raus aus der Anfängerstunde.

Ciao.
sugram
sugram 20.09.2019 um 10:13:59 Uhr
Goto Top
Vielen Dank für dein Hilfe.

Das mit dem lesen bin ich drüber, nur eine "vernünftige" zu finden ist nicht immer ganz einfach.

Deine Lösung muss ich erst einmal verdauen face-smile
Das muss ich jetzt erst einmal verstehen.
Kraemer
Kraemer 20.09.2019 um 10:26:49 Uhr
Goto Top
Zitat von @sugram:
Das muss ich jetzt erst einmal verstehen.
zum verstehen des o.g. Beispiels musst du dich mit dem Konzept der Pipes auseinander setzen und verstehen, das in der Powershell viel mit Aliasen gearbeitet wird. Um beim letzteren mal einen Einblick zu bekommen, kannst du einfach mal folgendes in eine Powershell eingeben:

get-Alias | Out-GridView

Gruß
sugram
sugram 20.09.2019 aktualisiert um 13:13:14 Uhr
Goto Top
Danke hier noch mals für die Info!