Rückgabewert von ln kann nicht in Variable gespeichert werden
Ein Hallo an die Experten!
Ich habe schon länger keine Batchdateien erstellt.
Daher muß ich derzeit öfter nachblättern oder hier im Forum nachfragen.
Bei dieser Gelegenheit ein großes Lob an die Spezialisten.
Die Anfragen werden rasch und kompetent beantwortet.
Meine Batchdatei ist fast komplett.
Natürlich wurde die Batchdatei umfangreicher als von Beginn an geplant. Dafür ist diese Batchdatei universeller als geplant.
Aktuell habe ich noch 2 Probleme.
Problem 1 ist die Speicherung vom Rückgabewert.
Ich möchte in der Batchdatei abfragen, wohin der Link (Junction oder Symbolic) eines Verzeichnisses oder einer Datei verweist.
Da die Möglichkeit besteht, daß dieses Verzeichnis ein eigenständiger Verzeichniseintrag ist, und daher kein Symboliklink und auch kein Junctioneintrag vorhanden ist,
möchte ich die Bildschirmausgabe in eine Variable umleiten.
Wenn der Rückgabetext mit ERROR: beginnt, möchte ich als Bildschirmanzeige den Text "Das Verzeichnis xxxxx ist ein eigenständiges Verzeichnis ohne Linkeintrag." auf dem Bildschirm anzeigen.
Gibt es einen Eintrag, so möchte ich die Verlinkung auf dem Bildschirm anzeigen lassen.
Mit dem Programm FSUTIL ist mir dieses Vorhaben gelungen
for /f "tokens=1 delims=:" %%a in ('fsutil hardlink list "%hardlinkziel%" ^| findstr /n .') do set cnt=%%a
if %cnt% GTR 1 (
fsutil hardlink list %hardlinkziel%
echo Das Verzeichnis %hardlinkziel% ist ein Hardlink mit %cnt% Einträgen.
) else (
echo Das Verzeichnis %hardlinkziel% hat KEINEN Hardlinkeintrag.
)
Beim Programm LN schaffe ich es aber nicht.
Die Bildschirmausgabe in eine Variable umzuleiten und den Inhalt weiter zu verarbeiten gelingt mir nicht.
Den Inhalt des Rückgabewertes vom Programm LN möchte ich wie folgt auswerten.
Entweder überprüfen, ob der Rückgabewert (Fehlermeldung) mit ERROR: beginnt.
Oder überprüfen, ob der Textteil -> im Rückgabewert vorhanden ist. In diesem Fall wäre der Rückgabewert mit der Pfadangabe und Dateiname des Links zu vergleichen.
zum Beispiel
D:\hardlink\ln --junction %hardlinkziel% > %merkvar%
Wenn der Inhalt der Variablen hardlinkziel im Inhalt der Variablen merkvar vorhanden ist, sollte in der Variablen merkvar der Verweis vom hardlinkziel zur Originaldatei stehen.
Bevor als Antwort die Frage kommt, wozu ich die Abfrage mit dem Programm LN machen will, gebe ich hiermit gleich die Erklärung und damit mein zweites Problem.
In dieser Batchdatei sollen Hardlinks für verschiedene Anwendungen erstellt werden.
Je nach Anwendung soll der Hardlink gleich für ein komplettes Verzeichnis oder auch nur für einzelne Dateien erstellt werden.
Ich habe es zwar geschafft, für alle 4 Möglichkeiten eine Batchabfrage zu erstellen, jedoch gelingt mir das leider nicht mit einer einzigen Abfrage.
Die Abfragemöglichkeit für Symlink einer Datei und für Symlink eines Verzeichnisses habe ich gelöst
D:\hardlink\ln --symbolic %hardlinkziel%
LN zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname
Um Hardlinks abzufragen, benötige ich bei Verzeichnissen auch das Programm LN, aber mit einem anderen Abfrageparameter.
D:\hardlink\ln --junction %hardlinkziel%
LN zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname
Für die Abfrage vom verlinkten Ziel eines Hardlinks für eine Datei benötige ich das Programm FSUTIL
D:\hardlinks\fsutil hardlink list "%hardlinkziel%"
FSUTIL zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname.
Bitte um Problemlösung
Bitte um Problemlösung 1,
Wie kann ich mit dem Programm LN die Rückgabe in eine Variable umleiten
und nach Auswertung - z.B. Überprüfung, ob am Textbeginn ERROR: steht - den gewünschten Text auf dem Bildschirm anzeigen.
Bitte um Problemlösung 2)
Ist es mit dem Programm LN oder mit dem Programm FSUTIL mit anderen mir nicht bekannten Abfrageeinstellungen möglich, mit 1 Routine alle 4 Varianten abzufragen.
z. b. D:\hardlink\ln --junction --symbolic %hardlinkziel% :rem Habe ich probiert, funktioniert aber nicht.
oder gibt es ein anderes Programm mit dem man mit einer einzigen Abfrage die Info bekommt,
ob es sich um eine symbolische Verknüpfung oder um einen Hardlink handelt, und wohin der Link verweist.
PS: Batchdatei, die mit dem Commandprompt auf allen Windows-Varianten funktionieren soll.
Danke im voraus
Gerry
Ich habe schon länger keine Batchdateien erstellt.
Daher muß ich derzeit öfter nachblättern oder hier im Forum nachfragen.
Bei dieser Gelegenheit ein großes Lob an die Spezialisten.
Die Anfragen werden rasch und kompetent beantwortet.
Meine Batchdatei ist fast komplett.
Natürlich wurde die Batchdatei umfangreicher als von Beginn an geplant. Dafür ist diese Batchdatei universeller als geplant.
Aktuell habe ich noch 2 Probleme.
Problem 1 ist die Speicherung vom Rückgabewert.
Ich möchte in der Batchdatei abfragen, wohin der Link (Junction oder Symbolic) eines Verzeichnisses oder einer Datei verweist.
Da die Möglichkeit besteht, daß dieses Verzeichnis ein eigenständiger Verzeichniseintrag ist, und daher kein Symboliklink und auch kein Junctioneintrag vorhanden ist,
möchte ich die Bildschirmausgabe in eine Variable umleiten.
Wenn der Rückgabetext mit ERROR: beginnt, möchte ich als Bildschirmanzeige den Text "Das Verzeichnis xxxxx ist ein eigenständiges Verzeichnis ohne Linkeintrag." auf dem Bildschirm anzeigen.
Gibt es einen Eintrag, so möchte ich die Verlinkung auf dem Bildschirm anzeigen lassen.
Mit dem Programm FSUTIL ist mir dieses Vorhaben gelungen
for /f "tokens=1 delims=:" %%a in ('fsutil hardlink list "%hardlinkziel%" ^| findstr /n .') do set cnt=%%a
if %cnt% GTR 1 (
fsutil hardlink list %hardlinkziel%
echo Das Verzeichnis %hardlinkziel% ist ein Hardlink mit %cnt% Einträgen.
) else (
echo Das Verzeichnis %hardlinkziel% hat KEINEN Hardlinkeintrag.
)
Beim Programm LN schaffe ich es aber nicht.
Die Bildschirmausgabe in eine Variable umzuleiten und den Inhalt weiter zu verarbeiten gelingt mir nicht.
Den Inhalt des Rückgabewertes vom Programm LN möchte ich wie folgt auswerten.
Entweder überprüfen, ob der Rückgabewert (Fehlermeldung) mit ERROR: beginnt.
Oder überprüfen, ob der Textteil -> im Rückgabewert vorhanden ist. In diesem Fall wäre der Rückgabewert mit der Pfadangabe und Dateiname des Links zu vergleichen.
zum Beispiel
D:\hardlink\ln --junction %hardlinkziel% > %merkvar%
Wenn der Inhalt der Variablen hardlinkziel im Inhalt der Variablen merkvar vorhanden ist, sollte in der Variablen merkvar der Verweis vom hardlinkziel zur Originaldatei stehen.
Bevor als Antwort die Frage kommt, wozu ich die Abfrage mit dem Programm LN machen will, gebe ich hiermit gleich die Erklärung und damit mein zweites Problem.
In dieser Batchdatei sollen Hardlinks für verschiedene Anwendungen erstellt werden.
Je nach Anwendung soll der Hardlink gleich für ein komplettes Verzeichnis oder auch nur für einzelne Dateien erstellt werden.
Ich habe es zwar geschafft, für alle 4 Möglichkeiten eine Batchabfrage zu erstellen, jedoch gelingt mir das leider nicht mit einer einzigen Abfrage.
Die Abfragemöglichkeit für Symlink einer Datei und für Symlink eines Verzeichnisses habe ich gelöst
D:\hardlink\ln --symbolic %hardlinkziel%
LN zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname
Um Hardlinks abzufragen, benötige ich bei Verzeichnissen auch das Programm LN, aber mit einem anderen Abfrageparameter.
D:\hardlink\ln --junction %hardlinkziel%
LN zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname
Für die Abfrage vom verlinkten Ziel eines Hardlinks für eine Datei benötige ich das Programm FSUTIL
D:\hardlinks\fsutil hardlink list "%hardlinkziel%"
FSUTIL zeigt den verlinkten Pfad mit Linkdateiname und den Pfad mit Originaldateiname.
Bitte um Problemlösung
Bitte um Problemlösung 1,
Wie kann ich mit dem Programm LN die Rückgabe in eine Variable umleiten
und nach Auswertung - z.B. Überprüfung, ob am Textbeginn ERROR: steht - den gewünschten Text auf dem Bildschirm anzeigen.
Bitte um Problemlösung 2)
Ist es mit dem Programm LN oder mit dem Programm FSUTIL mit anderen mir nicht bekannten Abfrageeinstellungen möglich, mit 1 Routine alle 4 Varianten abzufragen.
z. b. D:\hardlink\ln --junction --symbolic %hardlinkziel% :rem Habe ich probiert, funktioniert aber nicht.
oder gibt es ein anderes Programm mit dem man mit einer einzigen Abfrage die Info bekommt,
ob es sich um eine symbolische Verknüpfung oder um einen Hardlink handelt, und wohin der Link verweist.
PS: Batchdatei, die mit dem Commandprompt auf allen Windows-Varianten funktionieren soll.
Danke im voraus
Gerry
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1849433086
Url: https://administrator.de/contentid/1849433086
Ausgedruckt am: 18.11.2024 um 09:11 Uhr
15 Kommentare
Neuester Kommentar
Du kannst doch nicht einfach davon ausgehen, dass jeder weiß was das "Programm LN" ist, was es tut, wie die Ausgabe aussieht und ob es nun zum StdOut oder womöglich zum StdErr Stream schreibt. Vielleicht verlinkst du zumindest mal auf die Location wo du das Tool heruntergeladen hast? Vielleicht findet sich nur dann jemand der bereit ist das Ding auch herunter zu laden um dir zu helfen?
Steffen
Steffen
Leider schaffe ich es nicht, mit dem Programm LN den Verweis eines Hardlinks zu einem Verzeichnis abzufragen und anzuzeigen.
Hab das Ding mal runtergeladen. Schreibt zu StdOut, somit ist das Extrahieren wie bei jedem anderen Tool über FOR /F ohne Workarounds möglich.Code:
@echo off &setlocal
echo Ausgabe von LN:
ln --junction "a"
echo(
for /f "skip=1 tokens=2 delims=>" %%i in ('ln --junction "a"') do for /f "tokens=*" %%j in ("%%i") do set "merkvar=%%j"
echo merkvar:
echo "%merkvar%"
echo(
pause
Ausgabe meines Tests:
Ausgabe von LN:
ln 2.933
C:\Users\steffen\Documents\lnstatic\a -> C:\Users\steffen\Documents
merkvar:
"C:\Users\steffen\Documents"
Drücken Sie eine beliebige Taste . . .
ln 2.933
C:\Users\steffen\Documents\lnstatic\a -> C:\Users\steffen\Documents
merkvar:
"C:\Users\steffen\Documents"
Drücken Sie eine beliebige Taste . . .
Steffen
for /f "skip=1 tokens=2 delims=>" %%i in ('ln -j "b"') do for /f "tokens=*" %%j in ("%%i") do set "lnk=%%j"
if not defined lnk (
for /f "skip=1 tokens=2 delims=>" %%i in ('ln -s "b"') do for /f "tokens=2 delims=()" %%j in ("%%i") do set "lnk=%%j"
)
echo lnk:
echo "%lnk%"
Bei Hardlinks gibt es so etwas wie "die Originaldatei" nicht. Ich weiß nicht was du da vorhast. FSUTIL listet alle Namen auf die auf dieselbe physische Adresse auf dem Laufwerk verweisen. Und das können auch 10 oder 1000 sein.
Steffen
Was machst du dir denn für Probleme? Ich hab dir doch gezeigt wie die Ausgabe zu verarbeiten ist. Da gibt es keine unerwünschte Ausgabe in die Console.
"target" entsprechend anpassen ...
Reicht dir das an gelieferten Informationen? (Und erzähl mir nicht dass bei einem Hardlink nun %target% ausgegeben wird. Das ist und bleibt vollkommen egal ...)
Steffen
@echo off &setlocal
set "target=foo"
if exist "%target%" for %%i in ("%target%") do (
set "f=%%~fi"
set "attr=%%~ai"
) else set "f="
if defined f (set "dir=%attr:~,1%") else set "dir="
set "lnk=" &set "type="
for /f "skip=1 tokens=2 delims=>" %%i in ('ln -j "%f%"') do for /f "tokens=*" %%j in ("%%i") do (
set "lnk=%%j"
set "type=j"
)
if not defined lnk (
for /f "skip=1 tokens=2 delims=>" %%i in ('ln -s "%f%"') do for /f "tokens=2 delims=()" %%j in ("%%i") do (
set "lnk=%%j"
set "type=s"
)
)
if not defined lnk (
for /f "skip=1 delims=" %%i in ('ln -s "%f%"') do (
set "lnk=%%i"
set "ext=%%~xi"
)
)
if defined ext (
if ":1"=="%ext:~-2%" (
set "lnk=%f%"
set "type=n"
) else (
set "lnk=%f%"
set "type=h"
)
) else if not defined type (
set "lnk=%f%"
set "type=n"
)
echo dir: "%dir%" ("d" directory, "_" file)
echo type: "%type%" ("j" junction, "s" symlink, "h" hardlink, "n" no link)
echo lnk: "%lnk%"
echo(
pause
"target" entsprechend anpassen ...
Reicht dir das an gelieferten Informationen? (Und erzähl mir nicht dass bei einem Hardlink nun %target% ausgegeben wird. Das ist und bleibt vollkommen egal ...)
Steffen
Die Umleitung mit >nul ins Nirvna kenne ich.
Das leitet das StdOut um. Ich habe von 2>nul
für das StdErr gesprochen.Nur für die Inhaltsauswertung benötige ich die Umleitung in eine Variable.
FOR /F, wie in meinen Beispielen. Wenn du das StdErr nicht sehen willst, dann oben genannte Umleitung (innerhalb der Kommandozeile im Schleifenkopf maskiert zu 2^>nul
). Und wenn du StdErr mit StdOut verbinden willst um beides zu verarbeiten, dann 2>&1
(maskiert zu 2^>^&1
im Schleifenkopf.Will ich die Ausgabe in eine Variable umleiten hat offensichtlich die Batchdatei Probleme, wenn der Inhalt über mehr als 1 Zeile geht oder / und wenn es einen Zeilenumbruch gibt.
Die erste Zeile brauchst du nicht. Darum gibt es das "skip=1" in den FOR /F Schleifen.Steffen
Wenn alle Stricke reißen, schreib ich dir eben ein kleines Tool in C das die Ziele von allen möglichen Arten von Links ausgibt. Das sind vielleicht 200 Zeilen Code netto und ist in 'ner Stunde erledigt. Einziger Knackpunkt sind Hardlinks. Da müsste ich mir überlegen, wie das aussehen kann, damit es deinen Vorstellungen entspricht. Der Begriff "Hardlink" ist halt missverständlich. Es ist einfach kein Link. Oder, umgekehrt ausgedrückt, auch eine "normale" Datei ist bereits ein Hardlink, halt mit nur einem Pfad der die physische Datei referenziert. Nach allem was ich von dir gelesen habe, scheint es so, dass du unbedingt irgendeine Referenz (oder alle anderen Referenzen) ausgegeben bekommen willst, die halt nicht die übergebene Referenz ist.
Steffen
EDIT
Hab das kurz zusammen geschrieben. wetransfer link, bei Interesse:
https://we.tl/t-hfWMmt9Kv5
Steffen
EDIT
Hab das kurz zusammen geschrieben. wetransfer link, bei Interesse:
https://we.tl/t-hfWMmt9Kv5