chkdsk
Goto Top

Prüfen ob Datei auf mehreren PCs existiert

Hallo Zusammen,

ich hoffe Ihr habt gestern gut überstanden face-smile

Aktuell möchte mir eine Batch schreiben, die überprüft, ob auf mehreren PCs eine Datei existiert.
Das habe ich bisher genutzt, funktioniert auch wunderbar

@echo off
echo.
set /p ID=Gebe die IP Adresse ein: 
echo.
if exist "\\%ID%\C$\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUP\datei.txt" goto :ist vorhanden  
echo. 

:nicht vorhanden 
echo Datei nicht gefunden
pause
goto :fertig

:ist vorhanden
echo Datei gefunden
pause
goto :fertig

:fertig
ende

Jetzt möchte ich aber nicht jedes Mal die IP Adresse angeben, sondern die Batch soll als Quelle eine txt. Datei benutzen, in der mehrere IPs stehen und die dann automatisch durchgehen.
Nett wäre noch, wenn er mir sagen könnte, unter welcher IP die Datei nicht gefunden werden konnte.

Wäre schön wenn mir jemand behilflich sein könnte.


Update:
Ich habe jetzt mal folgendes probiert.
@echo off
for %%a in ("C:\Downloads\ip.txt") do (  
if exist "%%a" "\C$\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUP\datei.txt" goto :ist vorhanden  

:nicht vorhanden 
echo Datei nicht gefunden
pause
goto :fertig

:ist vorhanden
echo Skript gefunden
pause
goto :fertig

:fertig
ende
)

Die Batch sagt aber, Pfad nicht vorhanden.

Content-Key: 511144

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

Printed on: April 24, 2024 at 10:04 o'clock

Mitglied: 141575
141575 Nov 01, 2019 updated at 09:52:18 (UTC)
Goto Top
sondern die Batch soll als Quelle eine txt. Datei benutzen, in der mehrere IPs stehen und die dann automatisch durchgehen.

for /? eintippen oder das hier lesen
Tutorial zur FOR-Schleife
Member: chkdsk
chkdsk Nov 01, 2019 at 10:01:12 (UTC)
Goto Top
Moin,
bin ich tatsächlich schon durchgegangen, trotzdem vielen Dank dafür face-smile Daher ja auch mein Update in der eigentlichen Frage. Er scheint aber die zu verwendende Datei nicht finden zu wollen, da "Das System kann den angegebenen Pfad nicht finden."
Member: Kraemer
Kraemer Nov 01, 2019 at 10:04:46 (UTC)
Goto Top
Zitat von @chkdsk:

Moin,
bin ich tatsächlich schon durchgegangen, trotzdem vielen Dank dafür face-smile Daher ja auch mein Update in der eigentlichen Frage. Er scheint aber die zu verwendende Datei nicht finden zu wollen, da "Das System kann den angegebenen Pfad nicht finden."

1. Kennen wir den Inhalt deiner Datei nicht - Glaskugel
2. Ist das Leerzeichen gewollt? Sind die " gewollt?
if exist "%%a" "\C$\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUP\datei.txt" goto :ist vorhanden  
Member: chkdsk
chkdsk Nov 01, 2019 updated at 10:22:30 (UTC)
Goto Top
Hi,

in der ip.txt Datei stehen die IP Adressen der PCs, auf denen überprüft werden soll, ob es die Datei gibt. Aufgeführt sind diese wie folgt:
Beispielhaft
\\192.168.178.2
\\192.168.178.3
\\192.168.178.4
...

Ich denke auch hier die falsche Syntax zu verwenden. Habe es wie folgt geändert.
@echo off
for /F %%a in ("C:\Downloads\ip.txt") do (  
if exist "%%a\C$\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUP\datei.txt" goto :ist vorhanden  

Er sagt jetzt aber, Datei nicht gefunden. Die Datei mit den IP Adressen wird aber schon richtig übergeben oder habe ich einen Denkfehler.
Member: mayho33
mayho33 Nov 01, 2019 updated at 11:40:39 (UTC)
Goto Top
Wieso verteilst du dein Script nicht zuerst per GPO auf deine Clients (https://www.windowspro.de/wolfgang-sommergut/dateien-ordner-kopieren-ueb ..). Im Script legst du zusätzlich fest, dass es in einen bestimmten Ordner auf einen Share schreibt der für alle Clients zugänglich ist.
Nun noch einen zweite GPO einrichten die festlegt wann das Script laufen soll (Scheduled Task: https://social.technet.microsoft.com/Forums/en-US/bf79404a-08da-4e4d-af1 ..) .

Voila! Du hast dein Reporting

Übrigends: Anstatt hard-coded deine Pfade anzugeben solltest du mit SystemVariablen arbeiten: https://www.google.com/amp/s/www.winhelponline.com/blog/windows-10-shell ...
Member: Kraemer
Kraemer Nov 01, 2019 at 11:29:33 (UTC)
Goto Top
Wenn du dir deine Variable einfach mal mittels
echo
ausgeben lassen würdest, würdest du sehen, wo dein Problem ist.
Member: NordicMike
NordicMike Nov 01, 2019 at 11:50:59 (UTC)
Goto Top
Die GPO Idee gefällt mir auch, dann hängt das Script nicht, wenn ein PC nicht online ist.
Member: chkdsk
chkdsk Nov 01, 2019 at 11:54:39 (UTC)
Goto Top
Ich habe es jetzt wie folgt gelöst.
@echo off
setlocal EnableDelayedexpansion
for /F %%a in (PfadZurDatei\datei.txt) do (
set "host=%%a"  
if exist "!host!\PfadDerÜberprüftWerdenSoll\datei2.txt" (  

rem file exists
    ECHO %%a>>"C:\install-success.txt"  
    ) else (
    rem file does not exist
    ECHO %%a>>"C:\install-fail.txt"  
    )

)
endlocal
Member: NordicMike
NordicMike Nov 01, 2019 at 12:00:53 (UTC)
Goto Top
Wie prüfst Du, ob PCs in der Liste fehlen. Mach noch eine Datei „C:\kein-Ping.txt“.

Oder Du verwendest WSUS für solche Sachen (Softwareverteilung), es prüft automatisch ob bestimmte Dateien vorhanden sind. Auch gibt es einen fertigen Bericht, der Dir zeigt wer installiert hat und wer fehlt.
Member: mayho33
mayho33 Nov 01, 2019 at 15:39:47 (UTC)
Goto Top
Zitat von @chkdsk:

Ich habe es jetzt wie folgt gelöst.
> @echo off
> setlocal EnableDelayedexpansion
> for /F %%a in (PfadZurDatei\datei.txt) do (
> set "host=%%a"  
> if exist "!host!\PfadDerÜberprüftWerdenSoll\datei2.txt" (  
> 
> rem file exists
>     ECHO %%a>>"C:\install-success.txt"  
>     ) else (
>     rem file does not exist
>     ECHO %%a>>"C:\install-fail.txt"  
>     )
> 
> )
> endlocal
> 

So bekommst du halt nur einen temporären Report zur Laufzeit. Außerdem prüfst du vorher ob der Client existiert. Sowas dauert. Bei einigen 100 PCs oder mehr kann das Stunden dauern!!

warum das Script also nicht ein per GPO auf jeden Client verteilen? z.B. nach %Common AppData% (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders) So musst du dich nicht darum kümmern ob ein Client dazu kommt oder nicht. Das übernimmt deine GPO für dich.

UND: Ich verstehe nicht warum in Zeiten von Powershell immer noch BATCH verwendet wird. Wir leben im Jahr 2019 nicht 1989.

$shellFolders = Get-ItemProperty "HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"  
$startUp = $shellFolders.'Common Startup'  

$myFile1 = [System.IO.Directory]::GetFiles($startUp, "meineDatei1.txt", [System.IO.SearchOption]::TopDirectoryOnly)  

$report = New-Object psobject
$report | Add-Member -MemberType NoteProperty -name hostname -Value $([Environment]::MachineName)
$report | Add-Member -MemberType NoteProperty -name time -Value (Get-Date -Format "dd/MM/yyyy hh:mm:ss").ToString()  

if (![string]::IsNullOrEmpty($myFile1))
{
    $report | Add-Member -MemberType NoteProperty -name myFile1_exists -Value "YES"  
}
else
{
    $report | Add-Member -MemberType NoteProperty -name myFile1_exists -Value "NO"  
}

$report | Export-Csv "<mein UNC PFAD>\Report.csv" -NoTypeInformation -Append  

Danach noch eine GPO um das Script zu triggern: https://4sysops.com/archives/run-powershell-scripts-as-immediate-schedul ...

Somit hast du ein Set and forget
Member: chkdsk
chkdsk Nov 04, 2019 at 09:17:32 (UTC)
Goto Top
Erstmal vielen Dank an alle.

Über die GPO brauche ich es leider nicht versuchen. Da komme ich nicht ran, die wird zentral von einer anderen Abteilung gesteuert (Ich arbeite in einem großen Unternehmen).

Aktuell bleibt mir nur der manuelle scan.