Napisałem skrypt zapasowy w PowerShell. Upoważniłem go do odblokowania pliku, aby można go było uruchamiać bez interakcji.
Użyłem gpedit, aby dodać go do skryptów PowerShell, które będą uruchamiane podczas zamykania systemu.
Chociaż skrypt działa dobrze, wenn jest wykonywany bezpośrednio, ale po prostu nie działa podczas zamykania.
Wyłączyłem szybki rozruch i hibernację zgodnie z opisem w drugiej odpowiedzi na to pytanie, ale nic się nie zmienia.
Jak mogę się dowiedzieć
- czy mój skrypt nie działa
- lub skrypt nie jest w ogóle wywoływany
- i wtf dzieje się podczas zamykania systemu
Dodatek: więcej informacji
- Skrypt otwiera połączenie sieciowe z serwerem NAS i definiuje dysk sieciowy
- następnie kopiuje dane lokalne do nowo utworzonego folderu na tym dysku sieciowym, używając daty i godziny jako nazwy folderu
- po zakończeniu procesu kopiowania dysk sieciowy jest odłączany.
- Uznałem „przy wyłączeniu” za dobry analogon dla „wykonanej pracy”. Myślę, że podczas celowego wyłączania komputera bardzo prawdopodobne jest, że nastąpi pewien postęp.
- Nie wiem, czy to najlepszy wybór, aby to zrobić przy wyłączaniu, ale to najlepszy wybór, jaki znam. Być może można to zrobić automatycznie przy każdej zmianie pliku?
- Użyłem gpedit.msc do zainstalowania skryptu i poszedłem do Computerkonfiguracja-> Ustawienia Windows-> Skrypty-> Zamknij. Tam dodałem skrypt w dedykowanej Tabeli „PowerShell-Scripts”. Zmieniono ustawienia sekwencji, aby skrypty PowerShell były wykonywane jako pierwsze.
- Skrypt ma ścieżkę lokalną, C: \ Backupsoftware \ Smart_Backup_Create_folders_by_Date_MK.ps1
- Dane, które należy skopiować, znajdują się na pulpicie oraz w folderze dokumentów określonego konta użytkownika.
Więcej szczegółów Postępowałem zgodnie z sugestiami flolilolilo i dodałem wiersz na początku mojego skryptu, który w zasadzie wykonuje debugowanie printf (czy jest to debugowanie zapisu-wyjścia?). Miejsce, w którym znalazłem wyjściowy plik tekstowy, to
C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown
Skrypt jest więc najwyraźniej wywoływany, ale nie robi nic poza publikowaniem informacji debugowania. Czy mogę przekierowywać błędy i ostrzeżenia do pliku tekstowego?
Ach, a jak zamontować NAS?
New-PSDrive -Name "backup" -PSProvider Filesystem -Root "\\169.254.100.100\share"
Trzecie uzupełnienie
Nadchodzi aktualny kod.
#+-------------------------------------------------------------------+
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = |
#|{>/-------------------------------------------------------------\<}|
#|: | Authors: Aman Dhally; ariser | :|
#| :| Email: amandhally@gmail.com
#|: | Purpose: Smart Backup and create folder by Date
#| :|
#|: | Date: 29 November 2011 - 2017
#|: |
#| :| /^(o.o)^\ Version: n.a. |: |
#|{>\-------------------------------------------------------------/<}|
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = |
#+-------------------------------------------------------------------+
#System Variable for backup Procedure
# $date = Get-Date -Format d.MMMM.yyyy
$date = Get-Date -Format yyyy.MM.dd.HH.mm.ss
Write-Output "This script was called at %(Get-Date)" | Out-File .\test.txt
New-PSDrive -Name "backup" -PSProvider Filesystem -Root "\\169.254.100.100\Krautlight_aktiv"
# $source = "D:\Tally\Data\"
$destination = "backup:\$date"
# $path = test-Path $destination
$homeprefix= "C:\Users\MyUser\"
$directories = @{ }
$directories.add($homeprefix+"Documents\eagle", "EDA\eagle")
$directories.add($homeprefix+"Documents\KL\Eaglelibraries", "EDA\eigeneLibraries")
$directories.add($homeprefix+"Desktop\Flansch", "CAD\Flansch")
$directories.add($homeprefix+"Desktop\BoCubeDateien", "CAD\Bopla")
try{
mkdir $destination
; write-outpot "mkdir passsed" | out-file .\test.txt -append;
}
catch
{ write-output "mkdir failed" | out-file .\test.txt -append }
ForEach($source in $directories.KEYS.GetEnumerator())
{
cd backup:\
$destpath=$destination+'\'+$directories.Get_Item($source)
Copy-Item -Path $source -Destination $destpath -Recurse
cd c:\
}
Remove-PSDrive "Backup"
Moje bieżące dochodzenia pokazują działające wyjście komunikatów debugowania do pliku test.txt. A mkdir zawodzi.
Write-Output "This script was called at $(Get-Date)" | Out-File .\test.txt
?
try
- catch
(w połączeniu z out-file
-commandami) nie pomogłyby w zidentyfikowaniu problemu? coś w stylutry{gci .\; write-output "gci passed!" | out-file test.txt -append;}catch{write-output "gci failed!" | out-file test.txt -append}