evinben
Goto Top

Ziel einer Verknüpfung und Erweiterung einer Datei per Batch auslesen

Hallo alle miteinander!

ich war verwundert, dass dazu keine Lösungen zu finden sind.

1. Wie kann das Ziel einer Verknüpfung ausgelesen werden? Wenn es nur über VB-Skript gehen sollte, wie könnte der ermittelte Wert in der Batch weiterverarbeitet werden? Es geht darum Dateien, die über Verknüpfungen in einem Ordner zu erreichen sind, zu verwalten (verschieben, kopieren), um sowohl Redundanz auf dem Datenträger zu vermeiden als auch ein Asynchronlauf der Dateien nicht zu vernachlässigen (Doppelgänger - neu/alt - vermeiden).

2. Wie schaft ihr die Erweiterung einer Datei auszulesen?
Lösungen wie %var:~0,-4% geht schlecht, da die Anzahl der Buchstaben aller möglichen Erweiterungstypen nicht fest definiert ist.
Das Relevante, das mir bekannt ist, wäre %~x0 für die aktuelle Datei und mit %~x1 für das übergebene Argument. Könnte es eventuell mit "|" (Pipe) oder ähnlichen Tricks klappen?

Vielen Dank für eure Tipps!
evinben

Content-Key: 181739

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: bastla
bastla Mar 10, 2012 at 19:58:42 (UTC)
Goto Top
Hallo evinben!

Der Weg führt tatsächlich über VBS - etwa:
@echo off & setlocal
set "Lnk=%userprofile%\Desktop\VHD.lnk"  

set "G=%temp%\GetTargetPath.vbs"  
>%G% echo WScript.Echo CreateObject("WScript.Shell").CreateShortcut(WScript.Arguments(0)).TargetPath  

for /f "delims=" %%i in ('cscript //nologo %G% "%Lnk%"') do set "TargetPath=%%i" & set "TargetType=%%~xi"  
Grüße
bastla
Member: evinben
evinben Mar 12, 2012 at 09:32:09 (UTC)
Goto Top
gruß bastla!

wow, das ist ja kompliziert... Ich hätte mir es leichter vorgestellt.
Es funktioniert und ich danke dir hierfür!

Und um den Namen der Verknüpfung im Bezug auf eine bestimmten Datei zu generieren, die in dem selben Ordner vorliegt, wäre es:
:Name für die Verknüpfung generieren: die Bezugsdatei finden, ihre Dateierweiterung filtern und nur ihren Namen in der  Variable setzen.
for /f "delims=" %%d in ('dir  /b ^| findstr /C:"%File%"') do set LinkName=%%~nd   

Kapiert ;)

Großartig. DANKE BASTLA!!! Ich würde grene bei dir Praktikum machen.


gruß
evinben
Member: evinben
evinben Mar 13, 2012 at 15:39:24 (UTC)
Goto Top
Hallo Bastla,

ich habe nach einem langen Rätsel festgestellt, dass das Skript die Umlauten im Zielpfad zwar schön in der Eingabeaufforderung anzeigt aber diese werden in der temporär ausgegebenen txt-Datei konvertiert. Z. B. von "C:\Probe mit Umlauten.ÄÖÜßäöü.txt" wird:
C:\Probe mit Umlauten. Ž™šá„”.txt

Ich habe versucht das konvertierte Zeichne für "ü" duch "ü" zu ersetzen und es hat mit set var=%var:=ü% nicht funkioniert face-sad
Gibt es dafür eine Abhilfe?

Ich schildere mal kurz das Vorhaben/die Fragestellung konkret:
- In einem Ordner befinden sich Verknüpfungen mit Umlauten.
- Mit einer Batch-Datei soll die Zieldatei einer Verknüpfung kopiert und/oder verschoben werden. In dem Pfad zu der Zieldatei sind Umlauten vorhanden.
- Wie kann der Zielpfad in einer Variable gesetzt werden (um die Zieldateie verschieben bzw. kopieren zu können)?


Die letzte Beispielzeile von mir war doch eine schlechte Methode, da findstr im Zusammenhang mit dem Schalter /C: aber auch mit dem /X nicht mit Umlauten zurecht kommt.
Diese Zeile hier leistet dagegen Wunder:

:Dateinamen einer Datei, die im aktuellen Verzeichnis sich befindet, in eine Variable setzen (Erweiterung weglassen) 
for /f "delims=" %%d in ('dir /b "%File%"') do set LinkName=%%~nd  

gruß
evinben


Edit: alle Umlaute werden in der txt-Datei konvertiert ausgegeben
Member: bastla
bastla Mar 13, 2012 at 16:27:35 (UTC)
Goto Top
Hallo evinben!

Ein
chcp 1252 >nul
im Batch vorweg hast Du schon versucht?

Grüße
bastla
Member: evinben
evinben Mar 13, 2012 at 17:30:18 (UTC)
Goto Top
ja Bastla,

bei mir steht das Alles nun als Standard in jeder neuen Bach-Datei und wenn jemandem meine Bach-Vorlage weiter hilft, gebe ich sie hier weiter:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.bat\ShellNew]
:Mit "0D0A" wird ein Zeilenumbruch erzeugt. Diese Zahlen sind nicht in rechtem sondern in linkem Bereich während der Berbeitung von REG_BINARY eizungeben.  
:Folgender Eintrag wird in der Vorlage erzeugt:
:
:
:@echo off
:setlocal enabledelayedexpansion
:@prompt -$G
:chcp 1252 >nul
:PushD %~dp0
:echo.
:
:
:
:
:pause >nul
:
"Data"=hex:0d,0a,0d,0a,40,65,63,68,6f,20,6f,66,66,0d,0a,3a,73,65,74,6c,6f,63,\  
  61,6c,20,65,6e,61,62,6c,65,64,65,6c,61,79,65,64,65,78,70,61,6e,73,69,6f,6e,\
  0d,0a,40,70,72,6f,6d,70,74,20,2d,24,47,0d,0a,63,68,63,70,20,31,32,35,32,20,\
  3e,6e,75,6c,0d,0a,3a,50,75,73,68,44,20,25,7e,64,70,30,0d,0a,65,63,68,6f,2e,\
  0d,0a,0d,0a,0d,0a,0d,0a,0d,0a,0d,0a,70,61,75,73,65,20,3e,6e,75,6c,0d,0a

Als .reg abspeichern > ausführen und in dem Kontextmenü Neu den neuen Eintrag Windows-Batchdatei aufrufen.

Gruß
evinben
Member: evinben
evinben Mar 14, 2012 at 09:19:43 (UTC)
Goto Top
Einen schönen Mittwoch an alle!

ich habe sehr intensiv weiter experimentiert und bin zu dum folgenden Schluss gekommen, dass mit der Variante set var=%var:ü% nur zwei Umlauten sich ersetzen lassen - Ä und Ö - und leider keine andere.

:Ziel der Verknüpfung erfahren
:~~~~~~~~~~~~~~~~~~~~~~~~~

:@echo off
setlocal enabledelayedexpansion 
setlocal
@prompt -$G
chcp 1252 >nul

PushD %~dp0

:Ziel der Verknüpfung erfahren, um die entsprechende Datei zu kopieren
set "LinkFile=Probe mit Umlauten.ÄÖÜäöüß.txt.lnk"   
set "TempVBSkriptFile=%temp%\GetTargetPath.vbs"   
>%TempVBSkriptFile% echo WScript.Echo CreateObject("WScript.Shell").CreateShortcut(WScript.Arguments(0)).TargetPath   
for /f "delims=" %%i in ('cscript //nologo "%TempVBSkriptFile%" "%LinkFile%"') do set File=%%~nxi& set FileDirectory=%%~dpi& set TargetPath=%%~i  
set FilePath=%TargetPath%
echo Datei:		"%File%"  
echo Verzeichnis:	"%FileDirectory%"  
echo Pfad:		"%FilePath%"  

echo.
:Nur diese beiden Umlauten lassen sich erfolgreich ersetzen
set FilePath=%FilePath:Ž=Ä%
set FilePath=%FilePath:™=Ö%

echo %FilePath%

echo.
:Diese Zeichen lassen sich auf derselben Weise leider nicht ersetzen
set FilePath=%FilePath=„:ä%
set FilePath=%FilePath=:ü%
set FilePath=%FilePath=”:ö%
set FilePath=%FilePath=á:ß%
set FilePath=%FilePath=š:Ü%


echo %FilePath%>tmp.txt
pause >nul

Wie schafft ihr es? Gibt es eventuell andere Codepages, die ausprobiert werden sollten?
Wenn das Ersetzen der Umlauten im Batch nicht möglich wäre, gibt es hierfür alternativ eine VBS-Lösung?

Für jede Tipps/Anregungen/Vorschläge wäre ich dankbar.

bis bald
evinben
Member: bastla
bastla Mar 14, 2012 at 13:50:31 (UTC)
Goto Top
Hallo evinben!

Und wenn Du versuchsweise in den noch nicht funktionierenden Zeilen 31 bis 35 "=" und ":" in die richtige Reihenfolge bringst? face-wink

Aber im Ernst: Was soll denn in weiterer Folgen noch mit dem Pfad passieren? Wenn er ohnehin wieder ANSI-codiert benötigt wird, kannst Du ihn ja so lassen, wie er ist ...

Grüße
bastla
Member: evinben
evinben Mar 14, 2012 at 15:03:01 (UTC)
Goto Top
Danke Bastla,

ja das war es, danke face-smile. Nun werden alle Umlauten ersetzt.

Aber im Ernst: Was soll denn in weiterer Folgen noch mit dem Pfad passieren? Wenn er ohnehin wieder ANSI-codiert benötigt wird, kannst Du ihn ja so lassen, wie er ist ...

Das macht mir nun Stress und macht mich zugleich neugierig. Was mache ich nun wieder Falsch? In meinem Fall klappt es ohne zusätzlichen Nachbearbeitung der Umlauten definitiv nicht - schau:
type "%FilePath%"  
copy "%FilePath%" "%systemDrive%\Windows"  
Die Antwort lautet darauf 2x: Das System kann den angegebenen Pfad nicht finden.

Danke sehr, für die Fehlerkorrektur

"Setzen, Note 6!"
:'(

Gruß
evinben
Member: evinben
evinben Mar 14, 2012 at 18:48:09 (UTC)
Goto Top
Hallo Bastla,

nur Bescheid geben: mit CALL werden nun alle Umlaute-Zeichen ersetzt und anschließend der Pfad in eine Variable gesetzt. Ab dann laufen die Befehle wie **copy* wieder.

Also das Problem ist somit gelöst.

Vielen Dank noch mal für die intensive Unterstützung!


gruß
evinben