У меня была проблема с одним из моих сценариев, который несколько раз вызывал Remove-Item, вот они все:
Remove-Item -r -force "$path_Docs\*"
Remove-Item -recurse -force ( join-path $PSScriptRoot "\logs\*" ) | Out-Null
Remove-Item -r -force "$MappingFilePath\*
Эти переменные установлены в:
$MappingFilePath = ( Join-Path $PSScriptRoot "\Table Mappings\")
$path_Docs = (join-path $settings.files.data_folder "\documents")
По сути, я запустил свой скрипт, который является скриптом миграции схемы и занимает около 3 часов для базы данных, на которой я его запускал.Пошел на обед, вернулся и увидел, что мой сценарий решил попробовать и рекурсивно удалить весь диск C: \.Я не могу придумать причину, по которой это могло бы произойти, кроме того, что $ PSScriptRoot имеет значение NULL, но опять же я всегда Set-Location
в корневой каталог скрипта перед запуском скрипта, поэтому я не совсем уверен.
В любом случае, я добавил следующее в начало моего сценария main и снова выполнил его несколько раз без проблем:
## NOT AGAIN!!!
if ([string]::IsNullOrEmpty($PSScriptRoot)) {
Set-Output "[!!!] Dodged a bullet on this one" -colour red -logfilepath $log_prerequisites
break;
}
И изменил все вызовы Remove-Item
, чтобы иметь фильтр:
Remove-Item -r -force "$MappingFilePath\*.xlsx"
Remove-Item -recurse -force "$PSScriptRoot\logs\*.log" | Out-Null
Является ли использование $ PSScriptRoot лучшим способом получения каталога скриптов, и если нет, то какие еще методы существуют?и как использование вышеупомянутых команд могло привести к рекурсивному удалению C: \?
Редактирование дублирования: Это меньше об использовании $ PSScriptRoot и больше о том, как рекурсивноудаление могло произойти.