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
Bisher habe ich das in Powershell hinbekommen
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')
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 496729
Url: https://administrator.de/contentid/496729
Ausgedruckt am: 17.11.2024 um 19:11 Uhr
10 Kommentare
Neuester Kommentar
Zitat von @emeriks:
Hi,
wenn Du schon auf PS umsteigst, dann solltest Du auch deren "native" Kommandos benutzen.
dir => Get-CildItem
copy => Copy-Item
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
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.dir und copy sind nur aliase der jeweiligen Kommandos und können i.d.R. daher genauso verwendet werden.
Foreach ist hier überflüssig, die Property Path bzw. Fullname von Get-childitem wird in der Pipeline von Copy-Item direkt als Input verwendet.
Das siehst du in der Doku an der Beschreibung zum Parameter -Path
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Get-Childitem "c:\z\Daten\$VERZ\Images\Data\$Barcode30*" -Recurse | Copy-Item -Destination "d:\Ziel"
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Accept pipeline input: True (ByPropertyName, ByValue)
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
}
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.
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:
Gruß
get-Alias | Out-GridView
Gruß