调试器跳过大括号
debugger jumping over curly brackets
我正在编写一个脚本来遍历文件夹的内容,检查每个子目录的日期是否早于上周六,然后删除早于上周六的文件夹,但由于某种原因 powershell 调试器在 Get-ChildItem 大括号中缺少我的断点。没有错误消息,但我需要在 if 语句中添加一些内容以删除文件夹。调试器从 Get-ChildItem{}{
的左大括号跳转到函数末尾
这是我的代码:
#do weekly cleanup of DisasterBackup folder
function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
#find out filename with Saturday date before current date
(Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname | ForEach {$_}
{ #####debugger jumps from here to end bracket of WeeklyCleanup function when I step over
write-output $_
#check to see if item is before day we want to remove
$lastSaturday = GetLastSaturdayDate
if($_.LastWriteTime -le $lastSaturday)
{
#will remove dir once I've checked it's giving me the right ones
Write-Output $_
Write-Output " 1 "
}
}
} ############debugger skips to here
function GetLastSaturdayDate()
{
$date = "$((Get-Date).ToString('yyyy-MM-dd'))"
for($i=1; $i -le 7; $i++){
if($date.AddDays(-$i).DayOfWeek -eq 'Saturday')
{
$date.AddDays(-$i)
break
}
}
return $date
}
我给函数的目录如下所示:
E:\Bak_TestDatedFolderCleanup
我将其存储为字符串并将其提供给这样的函数:
$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs
它有一长串可能包含 10-20 个文件夹的列表,其中一些文件夹的名称中有日期,如下所示:
toLocRobo_2019-01-07
我的脚本完成后,它将删除所有日期早于上周六日期的子目录,但仅限于当月。无论我在哪一天 运行 脚本,我都希望它能正常工作。
我一直从这个 link 和其他的那里得到我的想法:
AddDays
escape missing
这可能是 Get-ChildItem 中的格式问题,但我没有看到。我只关心传递给 WeeklyCleanup 函数的文件夹中的子目录。这些子目录中有文件夹,但我不想查看它们。我之前为我的 dir 参数使用过这种格式,所以我认为它没有转义任何不应该转义的内容。
你的 ForEach 是一个 ForEach-Object 它有两个脚本块,第一个是隐含的 -Begin
类型。
也可以通过括在括号中并附加 .FullName
(Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname
您将 属性 扩展为字符串 - 它不再是对象并且丢失了 .LastWriteTime
属性.
为什么要格式化日期为ToString?它是一个字符串,不再是日期。
这里有一个更简单的变体:
function GetLastSaturdayDate(){
$Date = Get-Date
$Date.AddDays(-($Date.DayOfWeek+1)%7)} # on a saturday returns same date
#$Date.AddDays(-($Date.DayOfWeek+1))} # on a saturday returns previous sat.
}
function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Directory | ForEach {
"Processing {0}" -f $_.FullName
if($_.LastWriteTime -le (GetLastSaturdayDate)){
"LastWriteTime {0:D}" -f $_.LastWriteTime
# $_ | Remove-Item -Force -Recurse # delete
}
}
}
$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs
我正在编写一个脚本来遍历文件夹的内容,检查每个子目录的日期是否早于上周六,然后删除早于上周六的文件夹,但由于某种原因 powershell 调试器在 Get-ChildItem 大括号中缺少我的断点。没有错误消息,但我需要在 if 语句中添加一些内容以删除文件夹。调试器从 Get-ChildItem{}{
的左大括号跳转到函数末尾这是我的代码:
#do weekly cleanup of DisasterBackup folder
function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
#find out filename with Saturday date before current date
(Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname | ForEach {$_}
{ #####debugger jumps from here to end bracket of WeeklyCleanup function when I step over
write-output $_
#check to see if item is before day we want to remove
$lastSaturday = GetLastSaturdayDate
if($_.LastWriteTime -le $lastSaturday)
{
#will remove dir once I've checked it's giving me the right ones
Write-Output $_
Write-Output " 1 "
}
}
} ############debugger skips to here
function GetLastSaturdayDate()
{
$date = "$((Get-Date).ToString('yyyy-MM-dd'))"
for($i=1; $i -le 7; $i++){
if($date.AddDays(-$i).DayOfWeek -eq 'Saturday')
{
$date.AddDays(-$i)
break
}
}
return $date
}
我给函数的目录如下所示:
E:\Bak_TestDatedFolderCleanup
我将其存储为字符串并将其提供给这样的函数:
$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs
它有一长串可能包含 10-20 个文件夹的列表,其中一些文件夹的名称中有日期,如下所示:
toLocRobo_2019-01-07
我的脚本完成后,它将删除所有日期早于上周六日期的子目录,但仅限于当月。无论我在哪一天 运行 脚本,我都希望它能正常工作。
我一直从这个 link 和其他的那里得到我的想法: AddDays escape missing
这可能是 Get-ChildItem 中的格式问题,但我没有看到。我只关心传递给 WeeklyCleanup 函数的文件夹中的子目录。这些子目录中有文件夹,但我不想查看它们。我之前为我的 dir 参数使用过这种格式,所以我认为它没有转义任何不应该转义的内容。
你的 ForEach 是一个 ForEach-Object 它有两个脚本块,第一个是隐含的 -Begin
类型。
也可以通过括在括号中并附加 .FullName
(Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname
您将 属性 扩展为字符串 - 它不再是对象并且丢失了 .LastWriteTime
属性.
为什么要格式化日期为ToString?它是一个字符串,不再是日期。
这里有一个更简单的变体:
function GetLastSaturdayDate(){
$Date = Get-Date
$Date.AddDays(-($Date.DayOfWeek+1)%7)} # on a saturday returns same date
#$Date.AddDays(-($Date.DayOfWeek+1))} # on a saturday returns previous sat.
}
function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Directory | ForEach {
"Processing {0}" -f $_.FullName
if($_.LastWriteTime -le (GetLastSaturdayDate)){
"LastWriteTime {0:D}" -f $_.LastWriteTime
# $_ | Remove-Item -Force -Recurse # delete
}
}
}
$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs