none
BackUp-Skript nur per ISE ausführbar RRS feed

  • Frage

  • Hallo allerseits,

    folgend zu sehen ist ein kleines Skript, welches eine iTunes-Library

    mittels robocopy auf eine zweite HDD übertragen soll. Das selektieren der "richtigen" Platten

    erfolgt mit Hilfe der Namen, die HDDs müssen "iTunes" sowie "iBackUp" heißen damit der

    Kopiervorgang startet.

    $src_name = Get-WmiObject Win32_LogicalDisk | Where-Object {$_.VolumeName -eq "iTunes"};
    
    $dst_name = Get-WmiObject Win32_LogicalDisk | Where-Object {$_.VolumeName -eq "iBackUp"};
    
    $s1 = $src_name.VolumeName;
    $d1 = $dst_name.VolumeName;
    
    $src_letter = Get-WmiObject Win32_LogicalDisk -Filter "VolumeName='iTunes'";
    $s2 = $src_letter.DeviceID;
    
    $dst_letter = Get-WmiObject Win32_LogicalDisk -Filter "VolumeName='iBackUp'";
    $d2 = $dst_letter.DeviceID;
    
    if($s1 -ne "iTunes" -or  $d1 -ne "iBackUp")
    {
        Write-Host -ForegroundColor Green "`n`tiTunes- und/oder BackUp-Festplatte nicht angeschlossen!";
        Read-Host 'Press Enter to continue…' | Out-Null;
        exit(1);
    }
    else
    {
        robocopy.exe $s2 $d2 '*' /MIR /R:3 /W:5 /XD 'System Volume Information' '$RECYCLE.BIN';
        Start-Sleep '1';
        attrib -S -H $s\ /S /D;
        Start-Sleep '1';
        attrib -S -H $d\ /S /D;
    
        Read-Host 'Press Enter to continue…' | Out-Null;
        exit(0);     
    }

    Im ISE funktioniert dieses Skript wunderbar.

    Öffne ich es nun per Rechtsklick -> Mit Powershell ausführen, greift die if-Anweisung und ich erhalte,

    trotz angeschlossener Platten, die Nachricht "iTunes- und/oder BackUp-Festplatte nicht angeschlossen!"

    Ich kann mir dieses Verhalten nicht erklären und hoffe auf einige erhellende Kommentare.

    Viele Grüße & Danke im Voraus

    Dienstag, 7. Juni 2016 08:41

Antworten

  • Moin,

    irgendwie machrt Dein Skript alles dreimal. *_name und *_letter sind ja jeweils die gleichen Objekte, und nachdem Du sie auf unterschiedliche Art und Weise selktiert hast, vergleichst Du sie noch mal mit dem selektierten Wert.

    Das hier sollte in jeder Konstellation funktionieren:

    $src_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iTunes" })
    $dst_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iBackup" })
    
    if ($src_disk.Count -eq 1) {
        if ($src_disk.Count -ne 1) {
            Write-Host "Zielplatte nicht identifizierbar, Anzahl: $($src_disk.Count)"
            exit
        }
    } else {
        Write-Host "Quellplatte nicht identifizierbar, Anzahl: $($src_disk.Count)"
        exit
    }
    
    $s2 = $src_disk.DeviceID
    $d2 = $dst_disk.DeviceID
    
    Write-Host "Kopiere $s2 nach $d2"
    (ich habe den RoboCopy-Teil jetzt weg gelassen, da es um die Logik geht)


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.


    • Bearbeitet Evgenij Smirnov Dienstag, 7. Juni 2016 11:17
    • Als Antwort markiert BoLicH Dienstag, 7. Juni 2016 11:45
    • Tag als Antwort aufgehoben BoLicH Dienstag, 7. Juni 2016 11:45
    • Als Antwort markiert BoLicH Dienstag, 7. Juni 2016 11:45
    Dienstag, 7. Juni 2016 11:17

Alle Antworten

  • Moin,

    die if-Abfrage müsste eigentlich so aussehen:

    if(($s1 -ne "iTunes") -or  ($d1 -ne "iBackUp"))
    {
        #...
    }
    Ansonsten kannst du das Semikolon am Zeilenende weglassen

    Dienstag, 7. Juni 2016 09:35
  • Danke, die Änderung hat allerdings keine Abhilfe verschafft, das Problem besteht leider weiterhin!

    Dienstag, 7. Juni 2016 10:01
  • Hallo,

    @psott: Die Klammern um die einzelnen logischen Komponenten sind mehr Schönheit, in so einfachen Verknüpfungen werden sie nicht gebraucht. Der Befehl muss auch ohne ordentlich durchlaufen.

    Die PowerShell Console und die ISE sind nicht absolut identisch. Außerdem rufen beide verschiedene Profile auf. Hast du in deinem ISE-Profil irgendwas spezielles eingebaut? Du kannst deine Profile jeweils mit

    PSEdit $profile

    anzeigen lassen, wenn welche vorhanden sind.

    Was steht denn in deinen Variablen $s1 und $d1, wenn du es mit der ISE und mit der Console ausführst? Schreib mal

    Write-Host $s1; Write-Host $d1; Read-Host " "

    in deinen Code vor der fraglichen If-Bedingung. Das Read-Host dient nur dem Anhalten der Console. 

    Viele Grüße

    Christoph


    • Bearbeitet hpotsirhc Dienstag, 7. Juni 2016 10:28
    Dienstag, 7. Juni 2016 10:28
  • Hallo,

    verschiedene Profile sind nicht vorhanden, zumindest gibt PSEdit $Profile einen Fehler zurück.

    Die Variablen werden richtig deklariert, sowohl im ISE als auch per Copy/Paste in der

    Powershell ist $s1 = "iTunes" und $d1 = "iBackUp"

    Dienstag, 7. Juni 2016 11:09
  • Hallo,

    die Ermittlung von Name und DriveLetter der HD ist auch ein wenig umstaendlich, du kannst dir also 2 get-wmiobject Zeilen sparen.

    $SourceDrive = Get-WmiObject Win32_LogicalDisk -Filter "VolumeName='iTunes'"
    $s1 = $SourceDrive.VolumeName
    $s2 = $SourceDrive.DeviceID
    ....

    Auch die Benamung der Variabeln für Name und DeviceID mit $s1 und $s2 usw. macht das Script nicht gerade  lesbarer ... $SourceVolumename, $SourceDriveLetter usw. wären wohl besser.

    Beste Gruesse
    brima


    • Bearbeitet brima Dienstag, 7. Juni 2016 11:16
    Dienstag, 7. Juni 2016 11:16
  • Moin,

    irgendwie machrt Dein Skript alles dreimal. *_name und *_letter sind ja jeweils die gleichen Objekte, und nachdem Du sie auf unterschiedliche Art und Weise selktiert hast, vergleichst Du sie noch mal mit dem selektierten Wert.

    Das hier sollte in jeder Konstellation funktionieren:

    $src_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iTunes" })
    $dst_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iBackup" })
    
    if ($src_disk.Count -eq 1) {
        if ($src_disk.Count -ne 1) {
            Write-Host "Zielplatte nicht identifizierbar, Anzahl: $($src_disk.Count)"
            exit
        }
    } else {
        Write-Host "Quellplatte nicht identifizierbar, Anzahl: $($src_disk.Count)"
        exit
    }
    
    $s2 = $src_disk.DeviceID
    $d2 = $dst_disk.DeviceID
    
    Write-Host "Kopiere $s2 nach $d2"
    (ich habe den RoboCopy-Teil jetzt weg gelassen, da es um die Logik geht)


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.


    • Bearbeitet Evgenij Smirnov Dienstag, 7. Juni 2016 11:17
    • Als Antwort markiert BoLicH Dienstag, 7. Juni 2016 11:45
    • Tag als Antwort aufgehoben BoLicH Dienstag, 7. Juni 2016 11:45
    • Als Antwort markiert BoLicH Dienstag, 7. Juni 2016 11:45
    Dienstag, 7. Juni 2016 11:17
  • Hi,

    so funktioniert es nun, herzlichen Dank!

    $src_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iTunes" })
    $dst_disk = @(Get-WmiObject Win32_LogicalDisk -Filter { VolumeName="iBackup" })
    
    if ($src_disk.Count -eq 1)
    {
            if ($dst_disk.Count -ne 1)
            {
                Write-Host "HHD: 'BackUp' nicht identifizierbar!"
                exit(1);
            }
                else
                {
                    $s = $src_disk.DeviceID
                    $d = $dst_disk.DeviceID
                    robocopy.exe $s $d '*' /MIR /R:3 /W:5 /XD 'System Volume Information' '$RECYCLE.BIN';
                }
    } 
    else
    {
        Write-Host "HHD: 'iTunes' nicht identifizierbar!"
        exit(1);
    }

    Es ist mir zwar weiterhin rätselhaft warum es mit meiner Syntax nicht klappen wollte,

    aber so scheint es ja ohnehin sinnvoller zu sein...

    VG
    Dienstag, 7. Juni 2016 11:45