我的一个脚本遇到了一个问题,该脚本中有几个对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
在运行脚本之前先进入脚本的根目录,所以我不确定。 >
无论哪种方式,我都将以下内容添加到脚本主目录的顶部,然后再次运行了几次而没有问题:
## 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的用法有关,而与递归删除的发生方式有关。