patricks1990
Goto Top

Batch-Datei zum auslesen eines Speicherpfades aus einer Textdatei

Hallo,
ich bin neu hier und benötige eure Hilfe.

Ich programmiere sonst hauptsächlich in Python.
Ich speichere einige Dateipfade in einer Textdatei, der Aufbau ist dabei wie folgt:

Pfad A = C:\\
Pfad B = C:\\

Und so weiter.

Nun habe ich einige simple Batch-Dateien geschrieben, die Python-Skripte ausführen und dazu einen der interlegten Speicherpfade benötigen (Bspw. C:\User\Desktop\test.py).

Ich brauche nun also innerhalb dieser Batch-Dateien etwas Programmcode, welcher beispielsweise in die Textdatei schaut und nach Pfad A sucht, dann den Dateipfad hinter dem = kopiert und an passender Stelle einfügt (vor test.py).

Könnt ihr mir helfen?

Content-Key: 370976

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: NetzwerkDude
NetzwerkDude Apr 12, 2018 updated at 16:46:45 (UTC)
Goto Top
Wenn man Spaß am RegEx hat, kann man es immer damit Lösen face-smile - aber hier anderer Vorschlag: Die "Pfaddatenbank" als ein Hashtable in die cmd (bzw. PowerShell) reinladen:

Wenn du die Textdatei sowieso selber erstelltst, dann kannst du Sie in einem Format erstellen, das die PowerShell (alles was cmd kann, kann auch PowerShell, also nimm gleich die) als ein Hashtable einlesen kann:

Inhalt: Pfade.txt
@{
PfadA = "C:\bli\bla\blub\"  
PfadB = "D:\hier\ist\auch\was\"  
}

Nun kannst du in der Befehls.ps1 Datei diese reinladen mit:
$Pfadliste = Invoke-Expression (Get-Content Pfade.txt | Out-String)

Nun haste du eine schöne Hashtable mit Key - Value paaren:
Name                           Value                                                      
----                           -----                                                      
PfadB                          D:\hier\ist\auch\was\                                      
PfadA                          C:\bli\bla\blub\

Diese kannst du in der Befehl.ps1 ansprechen:
$Pfadliste.PfadA + "test.py"  
--> C:\bli\bla\blub\test.py


PS: Invoke-Expression ist eine Krasse sicherheitslücke in diesem Code, da er einfach alles ausführt was in der .txt steht face-smile Also nicht achtlos verwenden
Member: PatrickS1990
PatrickS1990 Apr 12, 2018 at 17:46:57 (UTC)
Goto Top
Vielen Dank, habe es soweit nachvollziehen können.

Wenn ich die Befehls.ps1 anschließend aufrufe, öffnet sich der Texteditor.

Wie schaffe ich es aber, dass die Python-Datei ausgeführt wird?
Die Batch Datei enthielt den Inhalt der Zeile 2. Damit wurde die Python-Datei ausgeführt.

Aktueller Inhalt der Befehls.ps1:
$Pfadliste = Invoke-Expression (Get-Content ini.txt | Out-String)
$Pfadliste.Python_Folder %USERPROFILE%\Desktop\PersonalLib\test.py
Member: NetzwerkDude
NetzwerkDude Apr 13, 2018 updated at 07:43:07 (UTC)
Goto Top
Zuerst die Skriptausführung in Powershell aktivieren:
Dazu die PowerShell Konsole einmal mit Administratorrechten ausführen, und das Kommando
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
ausführen.

Nun kannst du auf die .ps1 Datei rechtklicken und im Kontextmenü "Mit PowerShell ausführen" auswählen.
Member: PatrickS1990
PatrickS1990 Apr 13, 2018 at 07:56:33 (UTC)
Goto Top
Danke, gibt es da auch noch eine Lösung in Form einer solchen Batch-Datei?

Ziel ist folgendes:
Ich habe einige Python-Skripte und Batch-Dateien zum Ausführung dieser durch einen Doppelklick, die automatisch in die entsprechenden Verzeichnisse kopiert werden.
Eine Datei ini.txt wird erstellt, welche Beispielsweise u.a. den Dateipfad zur Python.exe beinhaltet.

Nun sollen diese Batch-Dateien den Dateipfad zur Python.exe aus der ini-Datei auslesen und die Python-Skripte ausführen.

Diese sollen weiterhin einfach mit einem Doppelklick aufgerufen werden können.

Es ist für mehrere, unerfahrene Personen gedacht, daher finde ich die Lösung mit der Vorherigen Eingabe eines Befehls in der PowerShell Konsole nicht sehr einfach.

Ist:
Ich muss in jeder Batch-Datei die Pfade zur Python.exe manuell anpassen (je nach PC).
Soll:
Pfade werden automatisch in oben Beschriebener Form in ini-Datei geschrieben.
Batch-Dateien lesen den Pfad selbstständig bei Ausführung aus der ini-Datei.
Member: NetzwerkDude
NetzwerkDude Apr 13, 2018 at 08:23:41 (UTC)
Goto Top
Du kannst eine Vernküpfung anlegen mit folgendem Ziel:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy remotesigned -file C:\Pfad\zu\deiner\Befehl.ps1

dieser würde per doppelklick powershell starten, die execution policy setzen, und die befehl.ps1 ausführen
Member: PatrickS1990
PatrickS1990 Apr 13, 2018 at 08:47:52 (UTC)
Goto Top
Ok, gibts ne Möglichkeit die Powershepp Konsole offen zu lassen nach Abarbeitung?
Bekomme einen Fehler in rot angezeigt, kann ihn jedoch so schnell nicht lesen.
Member: NetzwerkDude
NetzwerkDude Apr 13, 2018 at 09:12:22 (UTC)
Goto Top
z.B. zuerst PowerShell öffnen und dann zur .ps1 navigieren und diese ausführen
oder am ende vom skript ein
Read-Host 
einfügen, dann würde er nur nach tastendruck das fenster schließen
Member: PatrickS1990
PatrickS1990 Apr 13, 2018 at 09:24:15 (UTC)
Goto Top
Ok, da steht die Ausführung von Skripts auf diesem System ist deaktiviert.
Wir sie nicht aber durch
 -executionpolicy remotesigned
aktiviert?
Member: NetzwerkDude
NetzwerkDude Apr 13, 2018 at 09:26:50 (UTC)
Goto Top
eigentlich schon...
du kannst in einem ps terminal mit
Get-ExecutionPolicy
den status prüfen

Remotesigned = sollte skripte die du selbst geschrieben hast ausführen
Restricted, Default = führt sie nicht aus
Member: PatrickS1990
PatrickS1990 Apr 13, 2018 at 09:36:24 (UTC)
Goto Top
Ist leider Restricted.
Member: NetzwerkDude
NetzwerkDude Apr 13, 2018 at 09:48:31 (UTC)
Goto Top
Hast du den
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
als administrator ausgeführt?

also rechtsklick auf powershell, dann "als administrator ausführen" - nun in dieser shell mit erweiterten rechten den o.g. befehl ausführen
Member: Friemler
Friemler Apr 16, 2018 updated at 13:43:07 (UTC)
Goto Top
Hallo,

ohne Hick-Hack mit execution policies in plain old Batch Script:

@echo off & setlocal

set "IniFile=.\Pfade.ini"  
set "Key=PfadA"  
set "Value="  

for /f "tokens=1* delims==" %%a in ('findstr /ib /c:"%Key%" "%IniFile%" 2^>NUL') do (  
  set "Value=%%b"  
)

if defined Value (
  echo %Value%
)

In Zeile 12 kannst Du Deinen Code zum Starten der Python Scripte einfügen.

Grüße
Friemler


[EDIT]
Die Datei mit den Pfaden muss dann natürlich das Format einer klassischen Ini-Datei haben:

PfadA=C:\...
PfadB=D:\...
[/EDIT]