chaefre
Goto Top

Fehler bei Konvertierung von PS nach Batch

article-picture
Hallo in die Runde,

ich habe den Powershell Code - siehe unten- ins batch konvertiert aber ich erhalte nun die Fehlermeldung; "Das die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch." - siehe Bild - Komme aber nicht darauf wo hier jetzt der Fehler liegt

Der Powershell stammt aus dem anderen Beitrag

PS Code


PS-Code
# Quell-Pfad
$quelle = "C:\Users\tanc\Documents\Test\Quelle"    
# Zielpfad
$ziel = "C:\Users\tanc\Documents\Test\Ziel"    
# Datum abfragen
$date = read-host "Datum des Ordners eingeben (yyyymmdd)"    
# ordner ermitteln und diesen dann verarbeiten
foreach($folder in Get-ChildItem "$quelle\${date}_*" -Directory){    
    # Dateien nach SN gruppieren
    foreach($filegroup in Get-ChildItem "$($folder.Fullname)\Dokumente" -File -Filter *.pdf | ?{$_.Basename -match '^[FPS]_(\d{6})_'} | group {$matches[1]}){      
        # SN Ordner inkl. Unterordner erstellen
        $destination = "$ziel\$($filegroup.Name)"      
        if (!(Test-Path $destination)){
            New-Item -ItemType Dir -Path $ziel -Name $filegroup.Name -Force | out-null
            "A,B,C,D,E".split(",") | %{md "$destination\$_" -Force | out-null}    
            "Test,Vortest".split(",") | %{md "$destination\B\$_" -Force | out-null}    
            "A,B,C,D".split(",") | %{md "$destination\E\$_" -Force | out-null}    
        }
        # Dateien in den SN Ordner im Unterordner "\E\C" kopieren   
        $filegroup.Group | Copy-Item -Destination "$destination\E\C" -verbose      
        # passende Subordner in "\B\Test" kopieren   
        Get-ChildItem "$($folder.Fullname)\Vortest\*$($filegroup.Name)" -Directory | Copy-Item -Destination "$destination\B\Vortest" -Recurse -verbose -Force      
        # passende Subordner in "\B\Vortest" kopieren   
        Get-ChildItem "$($folder.Fullname)\Test\*$($filegroup.Name)" -Directory | Copy-Item -Destination "$destination\B\Test" -Recurse -verbose -Force      
    }
    # in der nächste Zeile das "-whatif"  entfernen um den Ordner dann anschließend tatsächlich löschen zu lassen  
    remove-item $folder.Fullname -Recurse -Force -whatif
}

Batch

@echo off
setlocal

REM Set source and destination paths
set quelle=""C:\Users\tanc\Documents\Test\Quelle""  
set ziel=""C:\Users\tanc\Documents\Test\Ziel""  

REM Prompt for date
set /p date="Datum des Ordners eingeben (yyyymmdd): "  

REM Loop through folders in source directory
 for /d %%A in ("%quelle%\%date%_*") do (  
    REM Group PDF files in Dokumente subfolder
  for %%B in ("%%A\Dokumente\*.pdf") do (  
   	   for /f "tokens=1 delims=_" %%C in ("%%~nB") do (  
            REM Create SN folder and subfolders
              set destination=""%ziel%\%%C""  
              if not exist "%destination%" (   
             mkdir "%destination%"  
                for %%D in (A B C D E) do mkdir "%destination%\%%D"  
                for %%E in (Test Vortest) do mkdir "%destination%\B\%%E"  
                for %%F in (A B C D) do mkdir "%destination%\E\%%F"  
            )
            REM Copy files to SN subfolder
            copy "%%B" "%destination%\E\C\" /y  

            REM Copy matching subfolders to destination
            for /d %%G in ("%%A\Vortest\*%%C") do (  
                robocopy "%%G" "%destination%\B\Vortest" /e /njh /njs /ndl /nc /ns /np /nfl /ndl /r:0 /w:0  
            )
            for /d %%H in ("%%A\Test\*%%C") do (  
                robocopy "%%H" "%destination%\B\Test" /e /njh /njs /ndl /nc /ns /np /nfl /ndl /r:0 /w:0  
            )
        )
    )
    REM Remove processed folder
     REM rd /s /q "%%A"  
    
    REM Pause after processing each folder
    pause
)

endlocal

Grüße

Content-Key: 1720072945

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

Printed on: May 3, 2024 at 04:05 o'clock

Member: NordicMike
NordicMike Aug 30, 2023 at 13:06:16 (UTC)
Goto Top
Ja gut, dass "\A" nicht existieren kann ist dir ja klar. Im Batch muss es so aussehen: "A:\", also musst du dein Format einfach umbauen.
Mitglied: 7907292512
7907292512 Aug 30, 2023 updated at 15:16:27 (UTC)
Goto Top
set destination=""%ziel%\%%C""
if not exist "%destination%" (
wieder doppelt gemoppelte Anführungszeichen und zusätzlich Stichwort DelayedExpansion und setzen von Variablen innerhalb von Klammern
@echo off &setlocal enabledelayedexpansion
REM ........
set "destination=%ziel%\%%C"  
    if not exist "!destination!" (  

set quelle=""C:\Users\tanc\Documents\Test\Quelle""
set ziel=""C:\Users\tanc\Documents\Test\Ziel""
Doppelt gemoppelte Anführungszeichen
set "quelle=C:\Users\tanc\Documents\Test\Quelle"  
set "ziel=C:\Users\tanc\Documents\Test\Ziel"  

Gruß sid
Member: Crusher79
Crusher79 Aug 30, 2023 at 18:57:13 (UTC)
Goto Top
Blöde Frage: Warum? PS ist so schön klar strukturiert - naja jedenfalls in manche Hinsicht besser als Batch.

Welchen Vorteil bringt das in 2023?
Member: Chaefre
Chaefre Aug 31, 2023 at 04:43:24 (UTC)
Goto Top
Hey danke für schnelle Unterstützung und Hilfe hier.
Zu hohe Beschränkungen an der Workstation. Andere Batch kann ich dort ausführen und bei PS ging es immer nicht, ich hatte es einmal geschafft es ausführen, aber das war dann mit der executionPolicy zu umständlich.

Trotzdem danke
Member: Crusher79
Crusher79 Aug 31, 2023 at 10:18:09 (UTC)
Goto Top
Gut ExecutionPolicy muss man setzen. Kann man auch global oder mit Zertifikaten arbeiten.

Wie hast du es denn geschafft? Normal ist der Syntax immer geich. Du kannst PS auch von CMD aufrufen und die ExecutionPolicy anpassen.

Sind nur ein paar Wörter mehr. Wenn es generell geht, ersparst du dir Arbeit - auch mit dem setzen der EP....,.
Mitglied: 7907292512
7907292512 Aug 31, 2023 updated at 10:20:44 (UTC)
Goto Top
ich hatte es einmal geschafft es ausführen, aber das war dann mit der executionPolicy zu umständlich.
Executionpolicy ist eh nur Schall und Rauch, lässt sich einfach mittels Bypass übergehen
powershell -EP Bypass -File "C:\pfad/zum\script.ps1"  
Member: Chaefre
Chaefre Aug 31, 2023 at 11:29:28 (UTC)
Goto Top
Ich glaube ich hatte etwas mit der Policy rum gespielt,

jetzt habe ich es mit dem ps nochmal gemacht -
PS C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine

PS C:\WINDOWS\system32> get-executionPolicy -List

Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined


PS C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy Remotesigned -Scope LocalMachine

PS C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy Remotesigned -Scope CurrentUser

PS C:\WINDOWS\system32> get-executionPolicy -list

Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine RemoteSigned


PS C:\WINDOWS\system32>

und in allen varianten hat es nicht funktion weder als undefined noch mit remotesigned
Member: Delta9
Delta9 Aug 31, 2023 at 15:01:41 (UTC)
Goto Top
Lt. MS: https://learn.microsoft.com/en-en/powershell/module/microsoft.powershell ...

"If the execution policy in all scopes is Undefined, the effective execution policy is Restricted for Windows clients and RemoteSigned for Windows Server."


"Restricted
The default execution policy for Windows client computers.
Permits individual commands, but does not allow scripts.
Prevents running of all script files, including formatting and configuration files (.ps1xml), module script files (.psm1), and PowerShell profiles (.ps1)."


also gilt bei dir restricted.

Wenn du remotesigned nimmt: wie hast du denn das Script signiert?
Member: Chaefre
Chaefre Aug 31, 2023 at 17:26:26 (UTC)
Goto Top
Ich hab's gar nicht signiert. Ich will's auch eigentlich gar nicht mit PS ausführen. Siddius hatte es in PS erstellt dankenswertweise aber Batch würde halt besser laufen , weil ich auch andere batches habe die da ohne Gemecker laufen.
Member: Chaefre
Chaefre Sep 05, 2023 at 10:38:28 (UTC)
Goto Top
Hi in die Runde,
ich habe das Script jetzt soweit, dass es grundlegend macht was es soll und nahezu in Batch korrekt sortiert.

1. Frage - wie vermeide ich dass, mir das Script einen Ordner mit dem Namen "protocol" erzeugt? Er zieht sich, weil in dem Durchsuch-Ordner noch Dateien sind, welche an der token Stelle das Wort protocol hat. Kann ich es nur auf Zahlen beschränken den Ausdruck "for /f "tokens=2 delims=_" %%C in ("%%~nB") do ("?


setlocal enabledelayedexpansion

REM Set source and destination paths
set "quelle=C:\Users\tanc\Documents\Test\Quelle"  
set "ziel=C:\Users\tanc\Documents\Test\Ziel"  

REM Datum abfragen
set /p date="Datum des Ordners eingeben (yyyymmdd): "  

REM Schleife um Ordner zu ermitteln und diese dann zu verarbeiten im quellverzeichnis 
for /d %%A in ("%quelle%\%date%_*") do (  
    REM Dateien nach SN gruppieren 
  for %%B in ("%%A\Dokumente\*.pdf") do (  
   	   for /f "tokens=2 delims=_" %%C in ("%%~nB") do (  
            REM Ordner und Subordner nach SN erstellen 
              set "destination=ziel\%%C"  
             if not exist "!destination!" (   
             mkdir "!destination!"  
			 )	
                for %%D in (Aida64_Log Gauging Production Project Service) do mkdir "!destination!\%%D"  
                for %%E in (Calibration Pre-Calibration) do mkdir "!destination!\Gauging\%%E"  
                for %%F in (Fokussierung Lidartest Reparatur Straßentest) do mkdir "!destination!\Service\%%F"				  
					REM Kopiert Fehlerreport/PCL/ Servicebericht in Ordner Reparatur 
					copy "%%B" "!destination!\Service\Reparatur\" /y  
					REM neue Schleife fürs kopieren von Vorprüfung und Prüfungsberichte
				
								REM Copy matching subfolders to destination
								for /d %%G in ("%%A\Vorprüfungen\*%%C") do (  
								robocopy "%%G" "!destination!\Gauging\Pre-Calibration" /e /njh /njs /ndl /nc /ns /np /nfl /ndl /r:0 /w:0  
								
								for /d %%H in ("%%A\Prüfungsberichte\*%%C") do (  
								robocopy "%%H" "!destination!\Gauging\Calibration" /e /njh /njs /ndl /nc /ns /np /nfl /ndl /r:0 /w:0  
							)
							)	
							
			)			
		)	
	)	

)

endlocal
Mitglied: 7907292512
7907292512 Sep 05, 2023 updated at 10:40:44 (UTC)
Goto Top
Stichwort findstr
Member: Chaefre
Chaefre Sep 05, 2023 at 11:28:42 (UTC)
Goto Top
da muss es ja dann in diese richtung gehen
  for /f "tokens=2 delims=_" %%C in ('findstr /b "[0-9][0-9][0-9][0-9][0-9][0-9]" "%%~nB"') do (  
Member: Chaefre
Chaefre Sep 08, 2023 at 05:36:06 (UTC)
Goto Top
Leider komme ich hier nicht weiter und nach Stöbern hier im Forum komme ich auf keine Lösung. Vielleicht habt Ihr noch eine Idee oder Tipp wie ich weiterkomme?
Member: mario59
mario59 Sep 09, 2023 at 13:03:17 (UTC)
Goto Top
16        set "destination=ziel\%%C"  
Hi, hab nicht die Endlösung, jedoch aufgefallen ist mir Zeile 16 mit dem "ziel" ohne %...%.
Nur mit "set /a ..." werden %...% weggelassen, für Verrechnungen mit Zahlen-Variablen.

14        for /f "tokens=2 delims=_" %%C in ('findstr /b "[0-9][0-9][0-9][0-9][0-9][0-9]" "%%~nB"') do (    
Nicht 8x '[0-9]'? (yyyymmdd)
Denke, findstr müsste aber in den 'do'-Sektor. Genauer kann ich auf die Schnelle leider
nicht werden, ohne vorher ausgiebig zu testen.
Member: Chaefre
Chaefre Sep 11, 2023 at 06:21:38 (UTC)
Goto Top
Nicht 8x '[0-9]'? (yyyymmdd)
Denke, findstr müsste aber in den 'do'-Sektor. Genauer kann ich auf die Schnelle leider
nicht werden, ohne vorher ausgiebig zu testen.


Ja nur 6 mal, weil er die Seriennummern rausgreifen soll. Das Datum von dem entsprechenden Ordner holt er sich schon mit der Eingabe ganz oben und das ist ja ja praktisch der Quellpfad in dem er die Seriennummern rausgreifen soll .
Mitglied: 7907292512
7907292512 Sep 11, 2023 updated at 10:22:39 (UTC)
Goto Top
... naja wollen wir mal nicht so sein, weil heute Montag und nicht Freitag ist ....
for /f "delims=" %%B in ('dir /b /a-d "%%A\Dokumente\*.pdf" ^|findstr /irc:"_[0-9]*\.pdf$" 2^>nul') do (  
..und wech ...
Member: Chaefre
Chaefre Sep 11, 2023 at 10:55:57 (UTC)
Goto Top
Hmm er wirft jetzt alle Dateien als Ordner aus und nimmt den ganzen Dateinamen als Ordner
Mitglied: 7907292512
7907292512 Sep 11, 2023 updated at 11:16:08 (UTC)
Goto Top
Dann hast es falsch eingebaut klappt hier probemlos ...

Wie wärs einfach mal mit RTFM? Dann bist du selbst schlauer und musst nicht jeden Furz erfragen face-wink.

Man so viel Zeit will ich mal für so ein Kindergartengewäsch bekommen face-big-smile.
Member: Chaefre
Chaefre Sep 11, 2023 at 11:13:59 (UTC)
Goto Top
for /d %%A in ("%quelle%\%date%_*") do (  
for %%B in ("%%A\Dokumente\*.pdf") do (  
for /f "delims=" %%B in ('dir /b /a-d "%%A\Dokumente\*.pdf" ^|findstr /irc:"_[0-9]*\.pdf$" 2^>nul') do (  
set "destination=ziel\%%B"  
             if not exist "!destination!" (   
             mkdir "!destination!"  
			 )	

Wäre das nicht dann so ?
Mitglied: 7907292512
7907292512 Sep 11, 2023 updated at 11:15:34 (UTC)
Goto Top
Zitat von @Chaefre:
Wäre das nicht dann so ?

Nö! Es wird nur Zeile 13 Komplett damit ersetzt, nichts hinzugefügt ...
Member: Chaefre
Chaefre Sep 11, 2023 at 11:21:30 (UTC)
Goto Top
OK dann erzeugt er bei mir trotzdem den Protocol ordner, wenn ich nur

for %%B in ("%%A\Dokumente\*.pdf") do (    


mit

for /f "delims=" %%B in ('dir /b /a-d "%%A\Dokumente\*.pdf" ^|findstr /irc:"_[0-9]*\.pdf$" 2^>nul') do (    

ersetze
Mitglied: 7907292512
7907292512 Sep 11, 2023 updated at 11:27:48 (UTC)
Goto Top
Nö hier in meinem Test nicht wird hier einwandfrei ausgefiltert, works as designed.

screenshot
Member: Chaefre
Chaefre Sep 11, 2023 at 11:50:11 (UTC)
Goto Top
Bei mir sieht es halt mit den Test-Ordnern so aus ... er erzeugt mir halt den p bzw. den protocol ordner
2023-09-11 13_49_39-c__users_tanc_documents_test_ziel
Member: Chaefre
Chaefre Sep 11, 2023 at 11:53:09 (UTC)
Goto Top
Hast du in deinem Testaufbau die C_P_111111.pdf - Dateien mit drin ?
Member: mario59
mario59 Oct 03, 2023 at 20:23:41 (UTC)
Goto Top
Hi,
ich weiss nichts von einer
C_P_111111.pdf, wofür auch immer gedacht.
Member: Chaefre
Chaefre Oct 06, 2023 at 10:37:25 (UTC)
Goto Top
Ja das belief sich nur auf die Fehlersuche mit Siddius