Wydawało by się, że jest to najbardziej trywialne zadanie jakie można wymyślić prawda? Wystarczy kliknąć, zaznaczyć, wybrać usuń i tyle… zadanie jest niestety bardziej skomplikowane bo chcemy zrobić to skryptem.
Załóżmy, że mamy na dysku D folder o nazwie TEMP w którym znajdują się dziesiątki tysięcy plików i folderów. Niektóre ścieżki do obiektów są bardzo długie, mają dziwne nazwy zawierające polskie znaki, spacje i inne śmieci. Dodatkowo, do niektórych obiektów mogą istnieć uchwyty które uniemożliwiają usunięcie. Co wtedy. Niestety w windows sprawa nie jest prosta. Mam doskonały przykład u jednego z moich klientów.
W wyniku działania jednego z narzędzi zostawał na dysku folder z takim śmietnikiem którego nie dało się usunąć skryptem bo remove-item zawsze zwracał błąd. Próbowałem napisać taki skrypt, który obsługiwałby każdą z trudności – długie ścieżki, procesy które blokują usunięcie, dziwne znaki, jakieś śmieciowe uchwyty do plików… dotarłem do 200 linii kodu i zacząłem się zastanawiać jak to możliwe że w unixowych systemach wystarczy napisać:
rm -r -f {ścieżka}
i temat jest rozwiązany a w windows zawsze robi człowiekowi pod górkę.
I to była właśnie myśl, której potrzebowałem. Oto rozwiązanie problemu – narzędzie unikxowe w windows czyli CYGWIN. Instalujemy Cygwin64 z tej strony: https://www.cygwin.com/install.html i wykorzystujemy go w skrypcie:
# Ścieżka do terminala Cygwina (zmień odpowiednio, jeśli jest inna)
$cygwinPath = "C:\cygwin64\bin\bash.exe"
# Polecenie do wykonania w Cygwin - zakładam że jest to d:\TEMP
$command = 'cd /cygdrive/d && rm -r -f /TEMP'
# Uruchomienie polecenia w Cygwin które realizuje usunięcie folderu wraz z zawartością
Start-Process -FilePath $cygwinPath -ArgumentList "--login -c `"$command`"" -NoNewWindow -Wait
Możecie mówić, że rozwiązanie jest z d00py ale jest skuteczne w 100%.