thomas86
Goto Top

Poweshell programm in einen Batch packen wie?

Zu nächst muss ich sage, dass ich noch nie eine batch datei erstellt habe.
Ich habe mit powershell ein kleines Programm geschrieben, was eine Bestimmte txt datei umschreibt und mit den veränderungen mir eine neue Ausspuckt.

hier das programm:
$Quelle="U:\Documents\PRDO.helaba_Fallback_out.txt"  
get-content $Quelle |
    select -Skip 1 |
    set-content "$Quelle-temp"  
move "$Quelle-temp" $Quelle -Force  

$Ziel="U:\Documents\PRDO.helaba_Fallback_out_kon.txt"  

get-Content $Quelle |

foreach-object {$_.TrimEnd(';')| Out-File -FilePath $Ziel -append}  


Nun möchte ich, dass es für belibige txt per mausklicks geht, dass ma eine neue Datei einfach in ein programm zieht und er es automatisch wieder ausspuckt. Ich dachte sowas könnte mit einer Batch datei gehen, ich weis nur nicht wie.

Wenn es eine Bessere bzw. einfache lösung gibt würde es mich sehr freuen.

danke für eure hilfe.

Content-Key: 168824

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

Printed on: April 23, 2024 at 14:04 o'clock

Member: schuhmann
schuhmann Jun 29, 2011 at 09:38:57 (UTC)
Goto Top
Hi,

mach dir eine .bat Datei und damit rufst du dein Powershell Sktip auf (Pfade natürlich anpassen):

powershell.exe -PSConsoleFile "C:\Programme\Microsoft\Exchange Server\bin\exshell.psc1" -command "C:\Test\Sktipt.ps1"
Member: Skyemugen
Skyemugen Jun 29, 2011 at 09:53:44 (UTC)
Goto Top
Aloha schuhmann,

das wäre ja sinnfrei face-wink denn dann wäre es weiterhin immer dieselbe .txt

Anyway, ich frage mich, warum es jetzt im Batch sein muss, ich möchte doch annehmen, dass eine Parameterübergabe und eine Endlosschleife im Powershell auch möglich sind.

Im batch würde ich nämlich derartige Sachen dann per drag & drop das so ablaufen lassen (ohne Funktion) face-wink
:loop
if "%~1"=="" goto :eof  
REM Hier könnte man den Aufruf des PS-Skriptes ausführen mit Parameterübergabe
shift
goto :loop

Und genau dieses lässt sich doch mit Sicherheit auch in Powershell durchführen.

greetz André
Member: Thomas86
Thomas86 Jun 29, 2011 at 10:00:50 (UTC)
Goto Top
@ Schuhmann

Also ich hab eine bat datei angelegt mit dem inhalt

powershell.exe -PSConsoleFile "C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" -command "U:\Documents\konvert.ps1"

also ich habe die PFade angepasst. Es tut sich leider nix. Wo liegt da ein fehler? in dem konvert.ps1 stehen halt die zeilen, die Poershell ausfürhen soll.

@ Skyemugen
Ich kann deiner Idee nicht ganz folgen. Aber deine Lösung hört sich so an als müsse man Powershell immer öffnen und die Zeilen eingeben??
Soweit muss ich dir recht geben, dass Schuhmanns vorschlag, den nachteil hat, dass die datei die verändert wird immer gleich heißen muss.

Vielleicht hilft es euch wenn ich euch sage, dass ich möchte, dass jeder mitarbeiter die selbe art von verschiedenen txt dateien problemlos konvertieren soll.
Das ist mein eigentliches Ziel.
Member: Skyemugen
Skyemugen Jun 29, 2011 at 10:21:04 (UTC)
Goto Top
Aloha,

*grübel* dabei hielt ich mein Vorhaben doch für einfach und einleuchtend aber gut ^_^

Wenn ich mich richtig belesen habe, gibt es in PS keine Sprungmarken? Wie macht man dort dann Endlosschleifen, hm.

Anyway, um dir noch einmal zu erläutern, was ich meine:

Wenn ich eine Textdatei auf mein Batchskript ziehe, ist die Datei, sprich Dateipfad & Dateiname der %1 (Parameter 1) (Glaube bei PS ist es %args oder so, kann das sein?) - sodass ich dachte, dass man im PS das genauso umsetzen könnte, dass du dann
$Quelle="$args"

Wobei ich natürlich nicht weiß, ob es in PS auch möglich ist, den Parameter zu kürzen, für die geänderte Ausgabe.

Zur Veranschaulichung: Im Batch würde es equivalent dann so sein:
set Quelle="%~1"  
set Ziel="%~dpn1_kon%~x1"  

Sprich: Laufwerk, Pfad, Dateiname des Parameter 1 als fertiges nutzen, das gewünschte Präfix _kon hinzufügen und die Dateiendung hinzufügen.

Leider habe ich nie mit PS gearbeitet und weiß daher nicht, ob es dort auch so einfach geht aber ich dachte, PS könne mehr als batch und darum kam ich mit dieser Idee.

Und wenn man dann mehrere Dateien auswählt und auf das Skript zieht, lasse ich im Batch eine Endlosschleife (bis %1 leer ist) via Sprungmarken laufen aber das geht wohl nicht so einfach im PS (?) ...

greetz André

P.S.: Wobei man eigentlich das Setzen des Parameters/Arguments nicht extra definieren müsste und direkt verwenden könnte.
Member: schuhmann
schuhmann Jun 29, 2011 at 10:22:42 (UTC)
Goto Top
Achso, da hab ich woh nicht richtig aufmerksam gelesen. Dachte du wolltest dein PS1 Skript von einer bat aus starten.

Wenn du das Skript von Skyemugen nimmst, steht in der Variable %~1 der Dateiname, von der Datei die du per Drag and Drop auf die Bat gezogen hast.
Die kannst du dann wieder per Parameter an das PS1 Sktipt geben.

Versuch die bat mal wie folgt:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe "C:\Test\Sktipt.ps1 %~1"

In deinem Powershell Skript kannst du auf die Variable $ARGS zugreifen, die enthällt den Parameter.

Sprich, du ziehst eine Datei auf deine BAT. Innerhalb der Bat wird der Dateiname als %~1 weitergegeben und im Powershellskript kannst du per $ARGS drauf zugreifen.
Member: Thomas86
Thomas86 Jun 29, 2011 at 10:56:05 (UTC)
Goto Top
Das ist etwas zu viel auf einmal ich versuche es schritt für schritt.

Also zunächst habe ich jetzt in meiner .ps1 datei folgendes geschrieben:

$Quelle="U:\Documents\PRDO.helaba_Fallback_out.txt"
$Ziel="U:\Documents\PRDO.helaba_Fallback_out_kon.txt"

set $Quelle="$args"

$Datei = get-content $Quelle
.
.
.
So und nun
sollte ich set $Ziel="%~dpn1_kon%~x1"

was schreibe ich denn da rein -> %~dpn1_kon%~x1

Wenn ich das richtig verstanden habe kann die batch datei nur mit parametern arbeiten, deshalb dieses $args.

Was ist denn jetzt mein nächster schritt.

Sorry ich kann echt nervig sein face-smile
Member: Thomas86
Thomas86 Jun 29, 2011 at 11:13:48 (UTC)
Goto Top
Also ich habe jetzt in der Batch Datei folgendes eingegeben:

"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" -command "U:\Documents\KONINT.ps1 PRDO.helaba_Fallback_out.txt"  

set $Quelle="PRDO.helaba_Fallback_out.txt"  
set $Ziel=""U:\Documents\PRDO.helaba_Fallback_out_kon.txt"  
dann passiert wieder nichts ???
Member: Skyemugen
Skyemugen Jun 29, 2011 at 11:22:53 (UTC)
Goto Top
Aloha,

also wenn ich mir deine Historie angucke, dann glaube ich, dass es auch mit batch only möglich wäre:
Du willst doch nur das letzte Zeichen einer Zeile löschen, wenn es ein Semikolon ist, korrekt? Und immer soll die Zeile 1 übersprungen werden, richtig?
@echo off & setlocal enabledelayedexpansion
:loop
if "%~1"=="" goto :eof  
set "Ziel=%~dpn1_kon%~x1"  
if exist "%Ziel%" del "%Ziel%"  
for /f "usebackq delims= skip=1" %%s in ("%~1") do (  
set "Zeile=%%s"  
if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%")  
)
shift
goto :loop

Der Code ist für das Drag&Drop einer oder mehrerer .txt-Dateien auf das Batchskript gemacht.

greetz André
Member: Thomas86
Thomas86 Jun 29, 2011 at 11:34:17 (UTC)
Goto Top
Jetzt löscht er mir die Datei und sagt:

The system can not find the file??

@echo off & setlocal enabledelayedexpansion

:loop

if "U:\Documents\PRDO.helaba_Fallback_out.txt"=="" goto :eof  

set "Ziel=U:\Documents\PRDO.helaba_Fallback_out.txt"  

if exist "%Ziel%" del "%Ziel%"  

for /f "usebackq delims= skip=1" %%s in ("%~1") do (   

set "Zeile=%%s"  

if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%")   

)
shift

goto :loop
Member: Skyemugen
Skyemugen Jun 29, 2011 at 11:39:48 (UTC)
Goto Top
... kann ich nicht nachvollziehen (abgesehen davon, dass er wenn dann nur die Zieldatei löscht, wenn sie schon vorhanden ist ...), das Skript funktioniert einwandfrei ... und bitte nutze mal die Formatierung

Warum steht bei dir im Ziel dasselbe wie in %1, obwohl nach meinem Skript ein _kon wie gewollt dazwischengesetzt wird?

Ist das jetzt das Skript, was du so hingebastelt hast oder wie? Wenn ja, dann kann es nicht funktionieren, weil
  • es für drag&drop ausgelegt ist
  • keine Datei überschreibt, sondern eine neue erstellt (ansonsten bräuchte man VBS)
Member: Thomas86
Thomas86 Jun 29, 2011 at 12:02:05 (UTC)
Goto Top
Danke es hat geklappt!


geht es nicht, dass ich eine neue veränderte datei auspuckt.?

Aber auch so hast du mir wirkich sehr geholfen.
Member: Skyemugen
Skyemugen Jun 29, 2011 at 12:07:44 (UTC)
Goto Top
Aloha,

wie ich bereits erwähnte: Das funktioniert nur wenn dann mit VBS und das ist nicht mein Kenntnisgebiet, wenn es um umfangreichere Sachen geht ^_^
Wobei ich mir nicht sicher bin, ob VBS auch mit drag&drop ,spich: Mehrfachdateienabhandlung arbeiten kann.

Ok, man könnte natürlich auch im batch eines machen, das Ziel als temporär setzen, die Ausgangsdatei löschen und dann die temporäre Datei als Ausgangsdatei umbenennen und zu ihrem ursprünglichem Platz verschieben ... könnte man, wenn man unbedingt will.

@echo off & setlocal enabledelayedexpansion
:loop
if "%~1"=="" goto :eof  
set "Ziel=%temp%\%~nx1"  
if exist "%Ziel%" del "%Ziel%"  
for /f "usebackq delims= skip=1" %%s in ("%~1") do (  
set "Zeile=%%s"  
if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%")  
)
del "%~1"  
move "%Ziel%" "%~dp1"  
shift
goto :loop

greetz André

P.S.: ich weiß nicht wie es bei Powershell ist aber hier werden alle Leerzeichen zwangsläufig entfernt
Member: Thomas86
Thomas86 Jun 29, 2011 at 12:20:26 (UTC)
Goto Top
Ein weiters problem ist aufgetreten.
ich will ja immer das

Nur das letzte semikolen in einer zeile Löschen, auch wenn es mehrere sind.

was es tut ist aber nur das eine letzte zu löschen.

als tipp es sind maximal 10 semikolons am ende.

ist ne reiesen file mit über 100.000 zeilen
Member: Skyemugen
Skyemugen Jun 29, 2011 at 12:37:27 (UTC)
Goto Top
Aloha,

aha, gut, das war mir nicht bewusst, dann sollte es so gehen:
@echo off & setlocal enabledelayedexpansion
:loop
if "%~1"=="" goto :eof  
set "Ziel=%temp%\%~nx1"  
if exist "%Ziel%" del "%Ziel%"  
for /f "usebackq delims= skip=1" %%s in ("%~1") do (  
	set "Zeile=%%s"  
	if "!Zeile:~-1!"==";" (  
	call :short
	) else (
	echo !Zeile!>>"%Ziel%"  
	)
)
del "%~1"  
move "%Ziel%" "%~dp1"  
shift
goto :loop

:short
if "!Zeile:~-1!" neq ";" (  
	echo !Zeile!>>"%Ziel%"  
	goto :eof
	)
set "Zeile=!Zeile:~0,-1!"  
goto :short

greetz André

P.S.: Das kann bestimmt dauern bei großen Dateien, ob VBS nicht doch besser wäre, mal sehen, ob unsere VBS Spezis auch mal hineinschauen ^_^

edit: Warum hatte ich das überflüssige eol noch drin, war was anderes xD
Member: Thomas86
Thomas86 Jun 29, 2011 at 13:02:46 (UTC)
Goto Top
Wieder genial, funktioniert aber nicht ganz, da es einige Zeilen löscht die datei ist dann auch nur halb so groß wie die ausgangsdatei.


Wenn es erlaubt wäre, dann würde ich ernsthaft eine entschädigung für die Zeit die du wegen mir verschwendet hast aufbringen. face-smile
Member: Skyemugen
Skyemugen Jun 29, 2011 at 13:19:26 (UTC)
Goto Top
Aloha,

ich erwähnte bereits, dass Leerzeilen gelöscht werden, wenn du die unbedingt mit reinhaben willst, muss ich gucken, wie ich das funktionstüchtig bekomme ...

edit:
@echo off & setlocal enabledelayedexpansion
:loop
if "%~1"=="" goto :eof  
set "Ziel=%temp%\%~nx1"  
if exist "%Ziel%" del "%Ziel%"  
for /f "tokens=1,* delims=: skip=1" %%r in ('findstr /n "^" "%~1"') do (  
	set "Zeile=%%s"  
	if "!Zeile:~-1!"==";" (  
		call :short
	) else (
		if "!Zeile!"=="" (  
			echo. >>"%Ziel%"  
		) else (
			echo !Zeile!>>"%Ziel%"  
		)
	)
)
del "%~1"  
move "%Ziel%" "%~dp1"  
shift
goto :loop

:short
if "!Zeile:~-1!" neq ";" (  
	echo !Zeile!>>"%Ziel%"  
	goto :eof
	)
set "Zeile=!Zeile:~0,-1!"  
goto :short

greetz André
Member: Thomas86
Thomas86 Jun 29, 2011 at 14:04:26 (UTC)
Goto Top
Auch das habe ich in den Griff bekommen, bleibt noch eine sache aus, nämlich erwiederholt immer und immer wieder den forgang

Es kommt bis zu letzten Zeile und dann fängt es wohl von vorne an.

und im cmd steht

The process cannot access the file because it is being used by another proccess
The process cannot access the file because it is being used by another proccess
The process cannot access the file because it is being used by another proccess

immer wenn er von neu anfängt kommt der fehl bericht.

Was muss ich hier indem genau verändern oder hinzufügen:

@echo off & setlocal enabledelayedexpansion
:loop

set Quelle=IN\PRDO.txt
if "%Quelle%"=="" goto :eof  
echo Input: [%Quelle%]

set Ziel=OUT\PRDO_kon.txt
if exist "%Ziel%" del "%Ziel%"  
echo Output: [%Ziel%]

echo Job gestartet, kann einige Minuten in Anspruch nehmen

for /f "usebackq delims= skip=1" %%s in ("%Quelle%") do (   
set "Zeile=%%s"  
if "!Zeile:~-1!"==";" (  
call :short
) else (
echo !Zeile!>>"%Ziel%"  
)
)
del "K:\KeyAccount Solution\04_Datenprojekte_Produkte_Preise\TPS-InvRBV\Betrieb\IPS_Konverter\INOUT\PRDO_kon.txt"  
shift
goto :loop

:short
if "!Zeile:~-1!" neq ";" (  
echo !Zeile!>>"%Ziel%"  
goto :eof
)
set "Zeile=!Zeile:~0,-1!"  
goto :short
Member: Skyemugen
Skyemugen Jun 29, 2011 at 14:13:21 (UTC)
Goto Top
Aloha,

  • -Formatierung endlich mal nutzen! sonst lese ich mir hier gar nichts mehr durch
  • brauchst du jetzt die Leerzeilen doch nicht oder wie hast du was in den Griff bekommen? wozu änder ich extra das Skript ...
  • änder doch mal Zeile 1 in @echo on & setlocal enabledelayedexpansion und gucke mal, wo er wirklich hängt, denn ich kann das Problem einfach nicht nachvollziehen oder nachstellen
  • Wie viele Zeilen hat deine Textdatei und wie lang ist die längste Zeile?
  • Und du hast bisher immer noch nicht ein einziges Mal gegrüßt oder Ähnliches ...

So, ich hab' Feierabend und ob ich heute noch einmal reinschaue, weiß ich nicht ...

greetz André
Member: Thomas86
Thomas86 Jun 29, 2011 at 14:47:30 (UTC)
Goto Top
Aloha zurück!

Vielen Dank!
Ich habe mit deiner hilfe jetzt was ich will.
Da ich ja immer nur eine Datei nach einander bearbeiten will, habe ich die erste :loop schleife entfernt und somit das problem im griff bekommen.

sorry ich hatte die Formatierungshilfe übersehen

Ich wünsch dir einen schönen Feierabend!

tausend greetz Thomas
Member: Skyemugen
Skyemugen Jun 29, 2011 at 14:56:36 (UTC)
Goto Top
Aloha, home, sweet home

ah, klar, du hattest ja jetzt mit fester Quelle und festem Ziel und doch wieder mit neuer Datei ... ... da macht loop natürlich keinen SInn und bringt dir den Fehler, ich richtete mich nach

neue Datei einfach in ein programm zieht
drag & drop (%1)

die selbe art von verschiedenen txt dateien
Plural (:loop)

aber gut, wenn alle Fehler beseitigt sind, kannst du den Fremdlesern höchstens noch den Gefallen tun und deine Kommentare nachbearbeiten und mit Codeformatierung versehen, das wäre schön. Nicht zu vergessen, den Beitrag dann als

greetz André
Member: Thomas86
Thomas86 Jun 29, 2011 at 19:52:48 (UTC)
Goto Top
aber gut, wenn alle Fehler beseitigt sind, kannst du den Fremdlesern höchstens noch den Gefallen tun und deine Kommentare
nachbearbeiten und mit Codeformatierung versehen, das wäre schön. Nicht zu vergessen, den Beitrag dann als
How can I mark a post as solved? zu markieren face-wink und am Allerbesten noch den Beitrag in den
[
verschieben(link)]

hoffe soweit erledigt

greetz Thomas