Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Poweshell programm in einen Batch packen wie?

Frage Entwicklung Batch & Shell

Mitglied: Thomas86

Thomas86 (Level 1) - Jetzt verbinden

29.06.2011, aktualisiert 21:51 Uhr, 3438 Aufrufe, 21 Kommentare

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:
01.
$Quelle="U:\Documents\PRDO.helaba_Fallback_out.txt" 
02.
get-content $Quelle | 
03.
    select -Skip 1 | 
04.
    set-content "$Quelle-temp" 
05.
move "$Quelle-temp" $Quelle -Force 
06.
 
07.
$Ziel="U:\Documents\PRDO.helaba_Fallback_out_kon.txt" 
08.
 
09.
get-Content $Quelle | 
10.
 
11.
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.
Mitglied: schuhmann
29.06.2011 um 11:38 Uhr
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"
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 11:53 Uhr
Aloha schuhmann,

das wäre ja sinnfrei 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)
01.
:loop 
02.
if "%~1"=="" goto :eof 
03.
REM Hier könnte man den Aufruf des PS-Skriptes ausführen mit Parameterübergabe 
04.
shift 
05.
goto :loop
Und genau dieses lässt sich doch mit Sicherheit auch in Powershell durchführen.

greetz André
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 12:00 Uhr
@ 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.
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 12:21 Uhr
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[0] oder so, kann das sein?) - sodass ich dachte, dass man im PS das genauso umsetzen könnte, dass du dann
$Quelle="$args[0]"
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:
01.
set Quelle="%~1" 
02.
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.
Bitte warten ..
Mitglied: schuhmann
29.06.2011 um 12:22 Uhr
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.
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 12:56 Uhr
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[0]"

$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[0].

Was ist denn jetzt mein nächster schritt.

Sorry ich kann echt nervig sein
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 13:13 Uhr
Also ich habe jetzt in der Batch Datei folgendes eingegeben:

01.
"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" -command "U:\Documents\KONINT.ps1 PRDO.helaba_Fallback_out.txt" 
02.
 
03.
set $Quelle="PRDO.helaba_Fallback_out.txt" 
04.
set $Ziel=""U:\Documents\PRDO.helaba_Fallback_out_kon.txt"
dann passiert wieder nichts ???
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 13:22 Uhr
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?
01.
@echo off & setlocal enabledelayedexpansion 
02.
:loop 
03.
if "%~1"=="" goto :eof 
04.
set "Ziel=%~dpn1_kon%~x1" 
05.
if exist "%Ziel%" del "%Ziel%" 
06.
for /f "usebackq delims= skip=1" %%s in ("%~1") do ( 
07.
set "Zeile=%%s" 
08.
if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%") 
09.
10.
shift 
11.
goto :loop
Der Code ist für das Drag&Drop einer oder mehrerer .txt-Dateien auf das Batchskript gemacht.

greetz André
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 13:34 Uhr
Jetzt löscht er mir die Datei und sagt:

The system can not find the file??

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
:loop 
04.
 
05.
if "U:\Documents\PRDO.helaba_Fallback_out.txt"=="" goto :eof 
06.
 
07.
set "Ziel=U:\Documents\PRDO.helaba_Fallback_out.txt" 
08.
 
09.
if exist "%Ziel%" del "%Ziel%" 
10.
 
11.
for /f "usebackq delims= skip=1" %%s in ("%~1") do (  
12.
 
13.
set "Zeile=%%s" 
14.
 
15.
if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%")  
16.
 
17.
18.
shift 
19.
 
20.
goto :loop
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 13:39 Uhr
... 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 <code></code> 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)
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 14:02 Uhr
Danke es hat geklappt!


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

Aber auch so hast du mir wirkich sehr geholfen.
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 14:07 Uhr
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.

01.
@echo off & setlocal enabledelayedexpansion 
02.
:loop 
03.
if "%~1"=="" goto :eof 
04.
set "Ziel=%temp%\%~nx1" 
05.
if exist "%Ziel%" del "%Ziel%" 
06.
for /f "usebackq delims= skip=1" %%s in ("%~1") do ( 
07.
set "Zeile=%%s" 
08.
if "!Zeile:~-1!"==";" (echo !Zeile:~0,-1!>>"%Ziel%") else (echo !Zeile!>>"%Ziel%") 
09.
10.
del "%~1" 
11.
move "%Ziel%" "%~dp1" 
12.
shift 
13.
goto :loop
greetz André

P.S.: ich weiß nicht wie es bei Powershell ist aber hier werden alle Leerzeichen zwangsläufig entfernt
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 14:20 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 14:37 Uhr
Aloha,

aha, gut, das war mir nicht bewusst, dann sollte es so gehen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
:loop 
03.
if "%~1"=="" goto :eof 
04.
set "Ziel=%temp%\%~nx1" 
05.
if exist "%Ziel%" del "%Ziel%" 
06.
for /f "usebackq delims= skip=1" %%s in ("%~1") do ( 
07.
	set "Zeile=%%s" 
08.
	if "!Zeile:~-1!"==";" ( 
09.
	call :short 
10.
	) else ( 
11.
	echo !Zeile!>>"%Ziel%" 
12.
13.
14.
del "%~1" 
15.
move "%Ziel%" "%~dp1" 
16.
shift 
17.
goto :loop 
18.
 
19.
:short 
20.
if "!Zeile:~-1!" neq ";" ( 
21.
	echo !Zeile!>>"%Ziel%" 
22.
	goto :eof 
23.
24.
set "Zeile=!Zeile:~0,-1!" 
25.
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
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 15:02 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 15:19 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
:loop 
03.
if "%~1"=="" goto :eof 
04.
set "Ziel=%temp%\%~nx1" 
05.
if exist "%Ziel%" del "%Ziel%" 
06.
for /f "tokens=1,* delims=: skip=1" %%r in ('findstr /n "^" "%~1"') do ( 
07.
	set "Zeile=%%s" 
08.
	if "!Zeile:~-1!"==";" ( 
09.
		call :short 
10.
	) else ( 
11.
		if "!Zeile!"=="" ( 
12.
			echo. >>"%Ziel%" 
13.
		) else ( 
14.
			echo !Zeile!>>"%Ziel%" 
15.
16.
17.
18.
del "%~1" 
19.
move "%Ziel%" "%~dp1" 
20.
shift 
21.
goto :loop 
22.
 
23.
:short 
24.
if "!Zeile:~-1!" neq ";" ( 
25.
	echo !Zeile!>>"%Ziel%" 
26.
	goto :eof 
27.
28.
set "Zeile=!Zeile:~0,-1!" 
29.
goto :short
greetz André
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 16:04 Uhr
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:

01.
@echo off & setlocal enabledelayedexpansion 
02.
:loop 
03.
 
04.
set Quelle=IN\PRDO.txt 
05.
if "%Quelle%"=="" goto :eof 
06.
echo Input: [%Quelle%] 
07.
 
08.
set Ziel=OUT\PRDO_kon.txt 
09.
if exist "%Ziel%" del "%Ziel%" 
10.
echo Output: [%Ziel%] 
11.
 
12.
echo Job gestartet, kann einige Minuten in Anspruch nehmen 
13.
 
14.
for /f "usebackq delims= skip=1" %%s in ("%Quelle%") do (  
15.
set "Zeile=%%s" 
16.
if "!Zeile:~-1!"==";" ( 
17.
call :short 
18.
) else ( 
19.
echo !Zeile!>>"%Ziel%" 
20.
21.
22.
del "K:\KeyAccount Solution\04_Datenprojekte_Produkte_Preise\TPS-InvRBV\Betrieb\IPS_Konverter\INOUT\PRDO_kon.txt" 
23.
shift 
24.
goto :loop 
25.
 
26.
:short 
27.
if "!Zeile:~-1!" neq ";" ( 
28.
echo !Zeile!>>"%Ziel%" 
29.
goto :eof 
30.
31.
set "Zeile=!Zeile:~0,-1!" 
32.
goto :short
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 16:13 Uhr
Aloha,

  • <code></code>-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é
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 16:47 Uhr
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.

01.
sorry ich hatte die Formatierungshilfe übersehen
Ich wünsch dir einen schönen Feierabend!

tausend greetz Thomas
Bitte warten ..
Mitglied: Skyemugen
29.06.2011 um 16:56 Uhr
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 gelöst(link) zu markieren und am Allerbesten noch den Beitrag in den richtigen Bereich(link) zu verschieben(link)

greetz André
Bitte warten ..
Mitglied: Thomas86
29.06.2011 um 21:52 Uhr
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
gelöst(link) zu markieren und am Allerbesten noch den Beitrag in den
richtigen Bereich(link) zu [http://www.administrator.de/index.php?faq=30
verschieben(link)]

hoffe soweit erledigt

greetz Thomas
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (10)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...