obsługa błędów jest niezmiernie istotna – nie tylko ze względu za komunikaty na ekranie [choć i to jest często ważne] ale bardziej na zastosowanie konkretnej akcji zależnie od tego co się dzieje. najczęściej oczywiście stosuje się try/catch, z pewnymi niuansami, o których trzeba pamiętać i o czym już pisałem. są niemniej przypadki, w których obsługa błędów nie jest taka trywialna zwłaszcza, jeśli korzysta się wewnątrz skryptu z zewnętrznych narzędzi/aplikacji. dla tego też zawsze bronię się rękami i nogami przed niekoszernymi rozwiązaniami, czasem nadpisując wiele linii kodu, byle tylko nie korzystać z zewnętrznych aplikacji. bywa jednak, że nie ma wyjścia.

takim przypadkiem jest scenariusz, w którym trzeba podmapować rejestr użytkownika aby wykonać jakieś operacje. gdzieś tam udało mi się dogrzebać do artu, w którym ktoś wykonywał ciężkie akrobacje programistyczne, aby obsłużyć to ‘natywnie’ – czyli bez ‘reg.exe’, to już jednak za dużo. nie ma więc wyjścia – trzeba skorzystać z ‘reg load’. problem polega na tym, że reg load nie zwraca konkretnego błędu/informacji. próbowałem przypisywać jako zmienną, przekierowywać do pliq… pustka.

#$ntuserdatPath wskazuje na położenie ntuser.dat np. \\comp\c$\users\user\ntuser.dat
$err=reg load "HKLM\__temp" "$ntuserdatPath"
echo $err #pustka
reg load "HKLM\__temp" "$ntuserdatPath"|out-file err.log
gc err.log #pustka

chwilkę mi zajęło, zanim przypomniałem sobie jak to się robiło za króla świeczka – i ta metoda działa tak samo obecnie. a chodzi konkretnie o to, że ‘reg’ wrzuca wszystko na standardowy strumień błędów, więc żeby go przechwycić, trzeba go przekierować na standardowy strumień wyjścia:

#$ntuserdatPath wskazuje na położenie ntuser.dat np. \\comp\c$\users\user\ntuser.dat
$err=reg load "HKLM\__temp" "$ntuserdatPath" 2>&1
echo $err.exception

#w PS2.o jest to źle obsługiwane i trzeba robić tak:
[string]$err=reg load "HKLM\__temp" "$ntuserdatPath" 2>&1
echo $err

jak widać cała tajemnica tkwi w “2>&1”. więcej szczegółów a propos oznaczeń strumieni można przeczytać w about_redirection.

eN.

 

 

 

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.