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

Dateinamen aus Datei auslesen und kopieren

Frage Entwicklung Batch & Shell

Mitglied: kristov

kristov (Level 2) - Jetzt verbinden

04.07.2008, aktualisiert 17.07.2008, 7207 Aufrufe, 24 Kommentare

Hallo,
ich suche nach einem Batch, der folgendes macht:

1. Durchsuche alle .html-Dateien in einem Verzeichnis (dieses hat keine Unterverzeichnisse mehr) nach Pfadangaben zu einer pdf und einer dxf-Datei.
So eine Pfadangabe in einer .html-Datei sieht etwa so aus: <a href="../../pdf/web/7211.pdf">, also relative Pfadangaben.

2. Wenn Du alle Pfadangaben in jeder .html-Datei in diesem Verzeichnis gefunden hast, kopiere alle .pdf und .dxf-Dateien aus den gefundenen Pfadangaben in einen neuen Unterordner "Dokumente".
Alternativ kann das natürlich auch so ablaufen:
Wenn Du die erste Pfadangabe in der ersten .html-Datei gefunden hast, kopiere sofort die gefundene .pdf oder .dxf-Datei in einen neuen Unterordner "Dokumente" und suche dann nach der nächsten Pfadangabe, wenn Du keine mehr findest, nimm die nächste .html-Datei und suche dort etc, bis alle Dateien durchsucht und alle .pdf bzw. .dxf-Dateien kopiert sind.

3. Nett wäre noch ein log-file, woraus ersichtlich ist, welche Dateien erfolgreich kopiert wurden und wo es Probleme gab (zB weil die .pdf oder .dxf-Datei nicht existiert - sollte zwar nicht vorkommen, aber der Teufel schläft nicht...)

4. Ganz nett wäre noch eine Erklärung, wie das Ganze funktioniert

Ich hab zwar schon ähnliche Beiträge gefunden, blick da aber nicht durch (s. Punkt 4.) Wer kann mir da weiterhelfen?
Mitglied: Biber
04.07.2008 um 21:14 Uhr
Moin kristov,

nein, keine Lösung, sondern nur eine Nachfrage zur Wahl des richtigen Werkzeúgs:
  • steht denn in den HTML-Dateien der Tag "<a href=,,[pdf oder dxf] >" als einziger "a href"-Tag in den HTMLs oder gibt es auch andere (auf *.jpg oder whatever), die Du aber nicht brauchst?
  • und stehen außer dem Tag noch andere Tags in der gleichen Zeile?

Grüße
Biber
Bitte warten ..
Mitglied: bastla
04.07.2008 um 21:41 Uhr
Hallo kristov!

Doch, ein Ansatz einer Lösung:
01.
@echo off & setlocal 
02.
 
03.
set "Basis=D:\test\files" 
04.
set "Typ=.html" 
05.
set "Ext=pdf|dxf" 
06.
set "Ziel=%Basis%\Dokumente" 
07.
set "Log=D:\Log.txt" 
08.
 
09.
if not exist "%Ziel%" md "%Ziel%" 
10.
if exist "%Log%" del "%Log%" 
11.
 
12.
set F=%temp%\FindLinks.vbs 
13.
>  %F% echo T = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll 
14.
>> %F% echo Set R = New RegExp 
15.
>> %F% echo With R 
16.
>> %F% echo     .Pattern = "<a href=.*\.(%Ext%)""?>" 
17.
>> %F% echo     .IgnoreCase = True 
18.
>> %F% echo     .Global = True 
19.
>> %F% echo     Set Links = .Execute(T) 
20.
>> %F% echo End With 
21.
>> %F% echo For Each L In Links 
22.
>> %F% echo     WScript.Echo Replace(Trim(Split(Left(L.Value, Len(L.Value) - 1), "=")(1)), "/", "\") 
23.
>> %F% echo Next 
24.
 
25.
for %%a in ("%Basis%\*%Typ%") do ( 
26.
    for /f "delims=" %%i in ('cscript //nologo %F% %%a') do ( 
27.
        if exist "%Basis%\%%~i" ( 
28.
            copy "%Basis%\%%~i" "%Ziel%">nul 
29.
        ) else ( 
30.
            echo Nicht gefunden: "%Basis%\%%~i">>"%Log%" 
31.
32.
33.
34.
if exist "%Log%" type "%Log%"
Kurze Erklärung:
Nachdem der Zielordner (falls noch nicht vorhanden) erzeugt und die Log-Datei (falls bereits vorhanden) gelöscht wurde, erstellt der Batch ein VBScript.

In diesem wird in einer übergebenen Datei anhand "regulärer Ausdrücke" nach allen Textstücken gesucht, welche mit "<a href=" beginnen und mit ".pdf>" (mit oder ohne Anführungszeichen nach "pdf") bzw mit ".dxf>" enden. (Eine Plausibilitätsprüfung hinsichtlich der Länge des Links wäre sicher noch eine Überlegung wert ...)

Damit der gefundene Link brauchbar wird, erfolgt eine Zerlegung des Tags beim "=" und auch gleich eine Ersetzung von "/" durch "\" sowie ein Entfernen von Leerzeichen vor oder nach dem Link.

Das Script liefert zeilenweise je einen Link an den aufrufenden Batch zurück.

Im Batch dient die erste Schleife (%%a) der Behandlung aller .html-Dateien, die %%i-Schleife ruft das Script mit je einer dieser Dateien auf und erhält jeweils einzelne Links innerhalb von Anführungszeichen oder auch nicht, daher Weiterverarbeitung mit "%%~i" - jetzt ist der Link sicher durch Anführungszeichen begrenzt.

Danach wird kontrolliert, ob die verlinkte Datei vorhanden ist, und diese kopiert oder eine Fehlermeldung protokolliert. Beim Kopieren wird übrigens eine ev bereits vorhandene Datei im Ordner "Dokumente" überschrieben.

Abschließend wird, falls Dateien nicht gefunden wurden, die Liste dieser Dateien ausgegeben.


Anzumerken wäre, dass ein Link nach einem Zeilenumbruch oder etwa TAB zwischen "a href=" und dem Link derzeit nicht gefunden wird.

Grüße
bastla
Bitte warten ..
Mitglied: kristov
04.07.2008 um 22:45 Uhr
Hallo,

danke für deinen Beitrag. Hätte nicht gedacht, daß das freitags Nacht noch wer liest
Um auf Deine Fragen zurückzukommen:

  • Hab die files jetzt nicht vorliegen, aber soweit ich mich erinnern kann, gibt's fallweise noch links auf andere html-Dateien. Jedenfalls brauch ich die tatsächlich nicht.

  • Ja, es stehen noch andere Tags in der gleichen Zeile. Falls nötig, könnte ich dafür sorgen, daß die relevanten Tags in einer eigenen Zeile stehen.
Bitte warten ..
Mitglied: 1bgks6
04.07.2008 um 23:00 Uhr
Was ist »ein Batch«? Meinst Du ein Script für cmd.exe? Welches Betriebssystem, welche Version? Suchst Du eine Lösung für Dein Problem oder eine Lösung für die Aufgabenstellung?

0.
Start->Run->cmd
1.
help for
help set
help if
google »cmd redirection«
2.
help copy
3.
google »cmd redirection«

::REM Name der logdatei
set log=%~n0.log.txt
::REM Verzeichnis Dokumente erstellen und log initialisieren.
mkdir Dokumente >%log%
::REM alle Dateien *html zeilenweise einlesen; an den Trennzeichen <, =, > in Tokens splitten.
::REM Das erste Token sei Variable %a; das zweite Token wird dann %b: der relative Pfad (inkl. ").
::REM Wegen Verwendung im Script ist dem Variablennamen ein weiteres % voranzustellen: %%a,...
::REM Wenn Token 1 ein »a href« ist, in die Bearbeitung einsteigen ...
::REM Wenn die Extension von %b dxf oder pdf ist, Datei nach Ordner Dokumente kopieren.
for /F "tokens=1,2 delims=<=>" %%a in (*.html) do if "%%a"=="a href" (
echo %%b >>%log%
if "%%~xb"=="dxf" copy /y %%b Dokumente >>%log%
if "%%~xb"=="pdf" copy /y %%b Dokumente >>%log%
)


4.
Das Ganze funktioniert (abgesehen von der üblichen noch notwendigen Popelei) bestenfalls zufällig: Es ist kaum annehmbar, daß die Anker an fixen Stellen in den HTML-Dateien stehen, genau ein HTML-Tag pro Zeile, und das Tag nie auf mehrere Zeilen verteilt. In einem nullten Durchgang müßten diese Vorraussetzungen vorbereitet werden. Ein Cmd-Script ist dafür ein masochistischer Lösungsansatz.
Bitte warten ..
Mitglied: kristov
04.07.2008 um 23:11 Uhr
Hallo, bastla!

Erst mal danke für Deinen Ansatz, der für mich jetzt tatsächlich wie eine Lösung aussieht
Besonders freut mich, daß Du Dich auch um Punkt 4 angenommen hast!

So wie's ausschaut, hast Du auch gleich Sachen eingebaut, über die ich noch nicht nachgedacht habe (bereits vorhandene Dateien überschreiben, vorhandene log-Datei löschen), das find ich wirklich klasse!

An und für sich sollte nach "a href=" kein Tab drin sein, ebensowenig ein manueller Zeilenumbruch, sodaß ich mir da keine Sorgen mache.

Ich werd's asap testen und vom Ergebnis berichten!
Bitte warten ..
Mitglied: bastla
04.07.2008 um 23:12 Uhr
Hallo 1bgks6 und willkommen im Forum!

Ein Cmd-Script ist dafür ein masochistischer Lösungsansatz.
"Masochistisch" ist vielleicht etwas übertrieben, aber mühsam ist es sicher ...

Einige Anmerkungen zu
01.
if "%%~xb"=="dxf" copy /y %%b Dokumente >>%log%
Da "%%~xb" als Ergebnis zB ".dxf" liefert, gehört der Punkt auch in den Vergleichswert.
Mit "if /i" kannst Du dafür sorgen, dass auch ".DXF"-Dateien kopiert werden.
Ein "copy" in einem Batch kommt ohne "/y" aus.
Der durch ">>%log%" erzeugte Eintrag "1 Datei(en) kopiert." ist zwar informativ, aber vielleicht doch besser mit der vorhergehenden Zeile zu kombinieren - etwa:
01.
if /i "%%~xb"==".dxf" copy "%%~b" Dokumente && echo Kopiert: "%%~b">>"%log%"
Grüße
bastla
Bitte warten ..
Mitglied: bastla
04.07.2008 um 23:35 Uhr
Hallo kristov!

Falls "asap" nicht mehr auf dieses Wochenende fallen sollte, werde ich urlaubsbedingt Deine Rückmeldung wohl erst in etwa 10 Tagen zu Gesicht bekommen ...

Grüße
bastla
Bitte warten ..
Mitglied: kristov
04.07.2008 um 23:41 Uhr
Hallo, Björn!

  • Ein Batch ist ein schrittweises Abarbeiten von Befehlsfolgen.
  • Ja, ich meine ein Script für cmd.exe
  • XP SP2
  • schwer zu sagen... Am Anfang war das Problem, daraus wurde die Aufgabenstellung. Das Problem haben die Mitarbeiter definiert, die Aufgabenstellung hab ich daraus abgeleitet. Wenn es der Sache dienlich ist, schildere ich gerne das Problem:

Es existieren mehrere Ordner, die jeweils mehrere (können praktisch schon mal 50, theoretisch maximal soviel, wie die Festplatte verträgt, sein) html-Dateien beinhalten. Ganz konkret sind das Stücklisten für irgendwelche Baugruppen und deren Bauteile. In jeder Stückliste (=html-Datei, für jede Baugruppe und jeden Bauteil 1 Stück) sind Links zu den Dokumentationen (pdf) und/oder zu den technischen Zeichnungen (dxf). Jetzt sollen alle pdf- und dxf-Dateien eines solchen Ordners zB einem (potentiellen) Lieferanten geschickt werden. Das wird so gelöst, indem jede einzelne html-Datei geöffnet und die pdf- und dxf-Dateien mit "Ziel speichern unter..." in einen separaten Ordner kopiert werden. Das ganze ist enorm zeitaufwändig und fehleranfällig. Sollte das Problem jetzt nicht der Aufgabenstellung entsprechen, bin ich für jeden Hinweis/Vorschlag dankbar.

0.
oder windows+r ->cmd

1.
ist mir zu oberflächlich bzw. zu theoretisch
cmd redirection ist gut. Kannte nur ">"

2.
ist mir klar

3.
ziemlich gut erklärt, danke!

4.
Da hast Du wohl die scripts noch nicht gesehen, die Biber und bastla hier schon abgeliefert haben. Ich halte sehr viel von batches, da sie imho sehr mächtig sind und schnell arbeiten, nur mit der Handhabung hapert's halt leider.
Bitte warten ..
Mitglied: kristov
04.07.2008 um 23:49 Uhr
Guten Abend

Naja, ich werd' sehen, was sich machen läßt, aber das WE ist bei mir schon ziemlich verplant. Außerdem würde ich mich hüten, Dich jetzt das ganze WE mit meinem Problemchen zu quälen, nur weil Du dann ein paar Tage nicht da bist. Das ganze soll Dir ja auch Spaß machen (und ich glaube, daß tut es tatsächlich!).

Ich wünsch Dir jedenfalls eine erholsame, computerfreie(!) Zeit!

kristov
Bitte warten ..
Mitglied: 1bgks6
05.07.2008 um 01:47 Uhr
Yepp, Danke für die nachgetragene Popelei. Mit "&& Kopiererfolg" wäre ich allerdings vorsichtig, weil der Errorlevel-Return von copy undokumentiert ist.
Bitte warten ..
Mitglied: 1bgks6
05.07.2008 um 01:58 Uhr
Gut, unter XP hast Du dann nicht nur command.com, sondern cmd.exe, kannst die Extensions aktivieren, und damit paßt es dann wie geschrieben (mit den Korrekturen von bastla).
Bitte warten ..
Mitglied: kristov
08.07.2008 um 07:35 Uhr
Guten Morgen!

Hab das script endlich getestet, es funktioniert aber nicht richtig. Ich glaube, der Hund liegt im VBScript begraben. Jedenfalls wird der Ordner Dokumente angelegt und auch ein künstlich erstelltes log.txt wird gelöscht. Das klappt also.

Was nicht klappt (wie ich glaube), ist das VBScript. Wenn ich die Datei FindLinks.vbs direkt aufrufe, bekomme ich den Fehler "Index außerhalb des gültigen Bereichs", Code:800A0009, Laufzeitfehler in Microsoft VBScript, Zeile:1, Zeichen:1. Hat jemand eine Idee, wie es zu diesem Fehler kommt?

Außerdem interessiert mich die Zeile
01.
>  %F% echo T = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll
Sollte es nicht heißen
01.
>>  %F% echo set T = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll
Jedenfalls habe ich das so ausprobiert, es funktionert trotzdem nicht. Kann mir da jemand weiterhelfen?
Bitte warten ..
Mitglied: Biber
08.07.2008 um 10:43 Uhr
Moin kristov,

schau mal bitte nach, auf welches Verzeichnis Deine %temp%-Variable zeigt.
Wahrscheinlich kommt bei heraus:
01.
>set temp 
02.
TEMP=C:\Dokumente und Einstellungen\kristov\Lokaler Firlefanz\Temp
... also ein Pfad mit Leerzeichen im Namen.
In diesem Fall solltest Du diese %F%-Variable ebenfalls in Anführungszeichen setzen. Also bastlas Zeilen 12/13 anpassen:
01.
... 
02.
set F="%temp%\FindLinks.vbs" 
03.
> %F% echo T = CreateObject 
04.
...
[rein biooptische Kurzanalyse, nicht getestet]

Grüße
Biber
Bitte warten ..
Mitglied: kristov
08.07.2008 um 14:51 Uhr
Hallo, Biber!

Danke für den Input. Hab's probiert, das war's leider nicht. Das VBScript wird korrekt angelegt und auch die Inhalte stehen so drin, wie's in der batch vorgegeben wird. Hab jetzt statt der temp-Variable die Basis-Variable genommen, die hat genau 8 Zeichen, die FindLinks.vbs wird auch hier korrekt angelegt, jedoch der Fehler bleibt der gleiche. Werd mir das CreateObject genau zerlegen und durchprüfen müssen, was das genau macht und ob die Syntax so stimmt...
Bitte warten ..
Mitglied: bastla
15.07.2008 um 00:08 Uhr
Hallo kristov und Biber, bin wieder da ...

... auf welches Verzeichnis Deine %temp%-Variable zeigt.
... sollte als Fehlerquelle auszuschließen sein, da für %TEMP% der Kurzname verwendet werden sollte und daher das Leerzeichen nicht zum Tragen käme - Anführungszeichen schaden aber natürlich nicht.

Werd mir das CreateObject genau zerlegen und durchprüfen müssen, was das genau macht
Der gesamte in der als Parameter übergebenen Datei (wenn denn eine übergeben wird, siehe unten) enthaltene Text wird für die Linksuche durch diese Zeile in eine Variable (T) eingelesen. (Das einfache ">" ist übrigens Absicht - damit wird sicher gestellt, dass das Script immer neu erzeugt wird, da die erste "echo"-Zeile so eine alte Version überschreibt.)

und ob die Syntax so stimmt...
Der Fehlermeldung nach liegt das Problem darin, dass das Script ohne Übergabe eines Argumentes (geöffnet/gelesen werden soll ja die Datei in WScript.Arguments(0)) aufgerufen wird - was eigentlich, obwohl ich in Zeile 26 die Anführungszeichen um das "%%a" herum vergessen habe, gar nicht möglich sein sollte - wenn %%a leer wäre, dürfte ja das "do" der "for"-Schleife nicht ausgeführt werden, und wenn es passende (.html-) Dateien mit einem Leerzeichen im Namen gibt, wäre die VBScript-Fehlermeldung "Die Datei wurde nicht gefunden." ...

Um dem Problem auf die Spur zu kommen, bitte einmal in Zeile 24 ein "echo on" einfügen und in der entstehenden Ausgabe den Dateinamen/-pfad hinter
01.
... cscript //nologo C:\DOKUME~1\kristov\LOKALE~1\Temp\FindLinks.vbs
überprüfen.

Grüße
bastla
Bitte warten ..
Mitglied: kristov
15.07.2008 um 09:25 Uhr
Guten Morgen, bastla!

Hoffe, Du hattest einen erholsamen Urlaub!
Danke, daß Du Dich meines Problems noch einmal annimmst. Hab jetzt ein echo on reingegeben und erhalte folgende Ausgabe:

C:\z0302_02\html>for %a in ("C:\z0302_02\*.html") do (for /F "delims=" %i in ('c
script //nologo "C:\DOKUME~1\kristov\LOKALE~1\Temp\FindLinks.vbs" %a') do (if ex
ist "C:\z0302_02\%~i" (copy "C:\z0302_02\%~i" "C:\z0302_02\Dokumente" 1>nul ) e
lse (echo Nicht gefunden: "C:\z0302_02\%~i" 1>>"C:\Log.txt" ) ) )

C:\z0302_02\html>if exist "C:\Log.txt" type "C:\Log.txt"

Der Code sieht jetzt so aus (Basis und Log verändert, F in Anführungszeichen gesetzt, echo on):

01.
@echo off & setlocal 
02.
 
03.
set "Basis=C:\z0302_02" 
04.
set "Typ=.html" 
05.
set "Ext=pdf|dxf" 
06.
set "Ziel=%Basis%\Dokumente" 
07.
set "Log=C:\Log.txt" 
08.
 
09.
if not exist "%Ziel%" md "%Ziel%" 
10.
if exist "%Log%" del "%Log%" 
11.
 
12.
set F="%temp%\FindLinks.vbs" 
13.
>  %F% echo T = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll 
14.
>> %F% echo Set R = New RegExp 
15.
>> %F% echo With R 
16.
>> %F% echo     .Pattern = "<a href=.*\.(%Ext%)""?>" 
17.
>> %F% echo     .IgnoreCase = True 
18.
>> %F% echo     .Global = True 
19.
>> %F% echo     Set Links = .Execute(T) 
20.
>> %F% echo End With 
21.
>> %F% echo For Each L In Links 
22.
>> %F% echo     WScript.Echo Replace(Trim(Split(Left(L.Value, Len(L.Value) - 1), "=")(1)), "/", "\") 
23.
>> %F% echo Next 
24.
echo on 
25.
for %%a in ("%Basis%\*%Typ%") do ( 
26.
    for /f "delims=" %%i in ('cscript //nologo %F% %%a') do ( 
27.
        if exist "%Basis%\%%~i" ( 
28.
            copy "%Basis%\%%~i" "%Ziel%">nul 
29.
        ) else ( 
30.
            echo Nicht gefunden: "%Basis%\%%~i">>"%Log%" 
31.
32.
33.
34.
if exist "%Log%" type "%Log%"
Bitte warten ..
Mitglied: bastla
15.07.2008 um 12:18 Uhr
Hallo kristov!

Wie oben schon angemerkt, muss zur Sicherheit in Zeile 26 auch "%%a" unter Anführungszeichen stehen, also:
01.
    for /f "delims=" %%i in ('cscript //nologo %F% "%%a"') do (
Allerdings weist Deine Ausgabe darauf hin, dass überhaupt keine .html-Datei gefunden wird - gesucht wird nämlich nur im %Basis%-Verzeichnis. Je nachdem, wo das neue "Dokumente"-Verzeichnis hin soll, ist daher entweder der Basis-Pfad oder in Zeile 25 das zu durchsuchende Verzeichnis anzupassen ...

Grüße
bastla
Bitte warten ..
Mitglied: kristov
15.07.2008 um 13:00 Uhr
Hallo, bastla!

Du hast natürlich recht. Akkurat war das %Basis%-Verzeichnis nicht korrekt. Jetzt sieht die Ausgabe so aus (und für jede .html-Datei ähnlich):

N:\HTML\z0302_03\html>(for /F "delims=" %i in ('cscript //nologo "C:\DOKUME~1\cw
immer\LOKALE~1\Temp\FindLinks.vbs" "N:\html\z0302_03\html\z0318AA-06.html"') do
(if exist "N:\html\z0302_03\html\%~i" (copy "N:\html\z0302_03\html\%~i" "N:\html
\z0302_03\html\Dokumente" 1>nul ) else (echo Nicht gefunden: "N:\html\z0302_03\
html\%~i" 1>>"C:\Log.txt" ) ) )

Jetzt ist mir aufgefallen, daß der copy-Befehl möglicherweise einen falschen Quellpfad enthalten könnte.

%~i müsste beispielsweise N:\PDF\nz001.pdf sein, da es ja in der .html-Datei heißt: <a href="../../../PDF/nz001.pdf">. Könnte es sein, daß er mit der Kombination aus der %Basis% und der %%i nicht zurecht kommt (Mischung aus absolutem und relativem Pfad?).
Bitte warten ..
Mitglied: bastla
15.07.2008 um 14:01 Uhr
Hallo kristov!

Könnte es sein, daß er mit der Kombination aus der %Basis% und der %%i nicht zurecht kommt (Mischung aus absolutem und relativem Pfad?).
Das sollte kein Problem sein.
Wie sieht denn die nächste Ausgabezeile aus (hier sollte ja "%~i" durch den extrahierten Pfad ersetzt werden)?

Du kannst testweise auch einmal an der Kommandozeile eingeben (oder auch per Drag and Drop der .html-Datei auf die .vbs-Datei testen):
01.
cscript //nologo "C:\DOKUME~1\cwimmer\LOKALE~1\Temp\FindLinks.vbs" "N:\html\z0302_03\html\z0318AA-06.html"
Das Ergebnis müsste der durch das VBScript extrahierte Linkpfad sein.

Grüße
bastla
Bitte warten ..
Mitglied: kristov
15.07.2008 um 15:02 Uhr
Hallo, bastla!

Hab jetzt zuerst das Script aufgerufen (die Findlinks.vbs wurde korrekt angelegt" und dann den Einzeiler. Hoffe, das ist richtig so. Einen Linkpfad habe ich jedoch nicht zurück bekommen, sondern einfach nichts?
Bitte warten ..
Mitglied: bastla
15.07.2008 um 15:41 Uhr
Hallo Kristov!

Bei mir sieht das so aus (ich habe einfach den Punkt 1 Deines Beitrages als "D:\Test\files\Eine Datei.html" gespeichert):
01.
D:\>type "%temp%\FindLinks.vbs" 
02.
T = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0) 
03.
).ReadAll 
04.
Set R = New RegExp 
05.
With R 
06.
    .Pattern = "<a href=.*\.(pdf|dxf)""?>" 
07.
    .IgnoreCase = True 
08.
    .Global = True 
09.
    Set Links = .Execute(T) 
10.
End With 
11.
For Each L In Links 
12.
    WScript.Echo Replace(Trim(Split(Left(L.Value, Len(L.Value) - 1), "=")(1)), " 
13.
/", "\") 
14.
Next 
15.
 
16.
D:\>type "D:\Test\files\Eine Datei.html" 
17.
1. Durchsuche alle .html-Dateien in einem Verzeichnis (dieses hat keine Unterver 
18.
zeichnisse mehr) nach Pfadangaben zu einer pdf und einer dxf-Datei. 
19.
So eine Pfadangabe in einer .html-Datei sieht etwa so aus: <a href="../../pdf/we 
20.
b/7211.pdf">, also relative Pfadangaben. 
21.
 
22.
D:\>cscript "%temp%\FindLinks.vbs" "D:\Test\files\Eine Datei.html" 
23.
"..\..\pdf\web\7211.pdf" 
24.
 
25.
D:\>
Wie es aussieht, kann das Script die Links in Deinen Dateien nicht finden. Könntest Du eine Originaldatei posten (oder auch mailen)?

Grüße
bastla
Bitte warten ..
Mitglied: kristov
15.07.2008 um 16:03 Uhr
Hallo bastla,

klar, kann ich eine Originaldatei posten. Die kleinste hat allerdings 10kB.
Und jetzt muß ich Dir was beichten: Hab grade gesehen, dass im <a>-Tag auch noch ein target angegeben ist, ein Link in wirklichkeit also so aussieht: <a href="../../../PDF/16463_02.pdf" target="_blank">. Ich glaube, da liegt der Hund begraben. Das tut mir jetzt wirklich leid, daß ich das nicht früher bemerkt habe! Kannst Du mir noch sagen, wie die Zeile 16 jetzt anzupassen ist, damit's klappt?

Demütig,
kristov
Bitte warten ..
Mitglied: kristov
17.07.2008 um 09:24 Uhr
Hallo, bastla!

Hab jetzt mal das target="_blank" rausgenommen und das script funktioniert wunderbar!
Möchte allerdings das target="_blank" drin lassen, habe deshalb
01.
.Pattern = "<a href=.*\.(%Ext%) target=""_blank""""?>"
verwendet. Das sollte nach meinem Verständnis erst mal richtig sein. Jetzt schmeißt es mich beim Zerlegen des Strings. Es funktioniert ja so, daß die Zeichen links vom = weggeschnitten werden (aus <a href="Pfad/Dateiname"> wird Pfad/Dateiname), mit dem target jedoch müßte auch noch der Teil rechts von der Extension weg (also aus <a href="Pfad/Dateiname" target="_blank"> sollte wieder Pfad/Dateiname werden. Leider verstehe ich die Zeile 22 nicht ganz. Könntest Du mir das bitte nochmal erklären?
Bitte warten ..
Mitglied: kristov
17.07.2008 um 10:31 Uhr
OK, hab's hinbekommen:
01.
>> %F% echo     .Pattern = "<a href=.*\.(%Ext%)""? target=""_blank"">"
und
01.
>> %F% echo     WScript.Echo Replace(Trim(Split(Left(L.Value, Len(L.Value) - 17), "=")(1)), "/", "\")
Vielen Dank an alle, besonders an bastla!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Ordner erstellen ll Datei hinein kopieren (1)

Frage von heyalice zum Thema Batch & Shell ...

Microsoft
Sfirm STA Datei automatisch kopieren (1)

Frage von thomasreischer zum Thema Microsoft ...

Batch & Shell
gelöst PowerShell, Log Datei auslesen, bei Änderungen E-Mail senden (12)

Frage von swissbull zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...