Copie de fichiers sur une liste de serveurs sur chemins non uniformes

Copie de fichiers sur une liste de serveurs sur chemins non uniformes - Infrastructures serveurs - Systèmes & Réseaux Pro

Marsh Posté le 16-09-2014 à 10:31:30    

Bonjour,
 
Dans le cadre d'une migration de notre système de supervision je dois mettre à jour un fichier sur une liste de serveurs et logger chaque copie.
La principale difficulté réside dans le fait que le fichier à remplacer peut se trouver à 3 endroits différents selon le serveur.
 
C:\NSCLient\scripts
D:\NSCLient\scripts
F:\NSCLient\scripts
 
Habituellement, pour une copie simple de fichier vers un répertoire uniforme je ferai un
 

Code :
  1. FOR /f %%a IN (liste.txt) DO XCOPY /Y "c:\nagios-update\nagios.pl" \%%a\C$\NSCLient\scripts >Copy.log 2>&1


 
Dans ce cas-ci je devrais donc utiliser IF EXIST, est-ce que quelque chose du genre fonctionnerait ?
 

Code :
  1. FOR /f %%a IN (liste.txt) DO
  2. IF EXIST "\%%a\F$\NSCLient\scripts" DO XCOPY /Y "c:\nagios-update\purgeoldfiles.cmd" \%%a\F$\NSCLient\scripts >Copy.log 2>&1
  3. ELSE
  4. IF EXIST "\%%a\C$\NSCLient\scripts\" DO XCOPY /Y "c:\nagios-update\purgeoldfiles.cmd" \%%a\C$\NSCLient\scripts >Copy.log 2>&1
  5. ELSE
  6. IF EXIST "\%%a\D$\NSCLient\scripts\" DO XCOPY /Y "c:\nagios-update\purgeoldfiles.cmd" \%%a\D$\NSCLient\scripts >Copy.log 2>&1
  7. ELSE
  8. ECHO "Prout"


 


---------------
Beer Snobs map / Topac fumage & salaisons
Reply

Marsh Posté le 16-09-2014 à 10:31:30   

Reply

Marsh Posté le 16-09-2014 à 13:30:35    

Salut,
 
Pourquoi ne pas utiliser Powershell pour ce genre de choses ? C'est assez simple. Voici un exemple de code qui pourrait correspondre à tes attentes :

Citation :

$servers = @("localhost" ) #A modifier par un Get-Content pour récupérer la liste des serveurs depuis un fichier
$letters = @("C", "D", "F" ) #Les lettres des drivers à checker
#Eventuellement ajouter le reste des variables ici
 
foreach($server in $servers){ #On parcourt la liste des serveurs
    foreach($letter in $letters){ #On test chaque lettres de drive
        $Path = "\\$server\$letter$\NSClient\scripts"
        if(Test-Path $path){
            Write-Host "Doing task with path : $path"
            Copy-Item "$path\*" "INSERT_DESTINATION_HERE"
            break #Si on trouve une lettre, alors on s'arrête là et on passe au serveur suivant
        }else{
            Write-Host "Path not found : $path"
        }
    }
}

Reply

Marsh Posté le 17-09-2014 à 14:08:58    

Au final j'ai effectivement utilisé Powershell
 

Code :
  1. $LogFile = "C:\Nagios\NagiosUpd.log"
  2. Get-Content "FR.txt" | %{
  3. $Server = $_
  4. $path = "\\$Server\"
  5. if (Test-Path (Join-Path $path "C$\NSClient\Scripts" )) { $path = Join-Path $path "C$\NSClient\Scripts" }
  6. elseif (Test-Path (Join-Path $path "D$\NSClient\Scripts" )) { $path = Join-Path $path "D$\NSClient\Scripts" }
  7.  elseif (Test-Path (Join-Path $path "F$\NSClient\Scripts" )) { $path = Join-Path $path "F$\NSClient\Scripts" }
  8. try { Copy-Item -Path "C:\Nagios\getNagiosSrvAddr.pl" -Destination $path -Force -Confirm:$false -ErrorAction 'Stop' }
  9. catch { "[Error][$Server] Failed to deploy file, Error: $($_.Exception.Message)" >> $LogFile }
  10. }


---------------
Beer Snobs map / Topac fumage & salaisons
Reply

Marsh Posté le 17-09-2014 à 16:25:09    

Prochaine étape, apprendre à utiliser les boucles :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed