【问题标题】:PowerShell Get-ChildItem with variable and string带有变量和字符串的 PowerShell Get-ChildItem
【发布时间】:2018-11-06 03:41:40
【问题描述】:

再次尝试使用 PowerShell 删除文件。

我现在正在尝试删除以“Export_”开头的文件,然后是两位数的年份,然后是儒略日期。例如,今天是 Export_18309。 18309 之后还有其他数字,但它们不相关。使用我当前的代码“Export_”是一个字符串,我的日期已转换为 Int,以便我可以进行数学运算并增加它。

我将 $dval 设置为 18302 作为我正在使用的文件的测试用例。我知道它当前没有删除任何内容,因为我正在输出到文本文件以进行手动验证,然后再继续。但是,如果文本文件的输出不正确,则尝试删除是没有意义的。

我的问题目前在 function WriteArch 代码块中。我正在尝试将字符串和 int 结合起来,让 PowerShell 显示仅以“Export_”和$dval 开头的结果作为 Export_$dval。为了更好地描述我正在尝试的内容,我编写了特定的代码行。

编辑:WriteArch 中的 for 循环是将 18302 递增到 18303,然后是 18304 等,因为我正在删除脚本运行前一周的文件。

$path0 = 'U:\PShell\Testing\IBM3 Cleanup\logfiles'
$archLog = 'U:\PShell\Testing\IBM3 Cleanup\LogArchive.txt'

$day = (Get-Date).DayOfWeek
$date = (Get-Date).ToString("yy") + ((Get- 
Date).DayOfYear).ToString("D3") 
$dval = $date -as [Int]

$dval = Switch ($day) {
"Monday" { ($dval - 7); break }
"Tuesday" { ($dval - 8); break }
"Wednesday" { ($dval - 9); break }
"Thursday" { ($dval - 10); break }
"Friday" { ($dval - 11) }
}

Clear-Content $archLog

$dval = 18302

function WriteArch {
    param( $dval, $path0)
        for ($i = 0; $i -le 4; $i++) {
            Get-ChildItem -Path $path0|
            Where { $_.FullName -Match "Export_" + "$dval"}|
            Add-Content $archLog
            $dval++ 
        }
}

WriteArch $dval $path0

Invoke-Item $archLog

【问题讨论】:

    标签: powershell scripting get-childitem


    【解决方案1】:

    Match 运算符支持正则表达式。我认为这对于您描述的场景来说有点矫枉过正 - 我建议使用Like* 是必不可少的,因为它告诉 PowerShell 在您指定的名称之后还有更多内容。

    Fullname 包含完整路径,包括父目录等 - 听起来您想基于 BaseName 进行匹配,即不包括扩展名的文件名。

    Where { $_.BaseName -like "Export_$dval*"}
    

    $dval 变量放在引号中会强制PowerShell 将int 隐式转换为string

    Comparison operators documentation,很好的参考。

    【讨论】:

    • 这也应该使用类似的循环来删除文件对吗?例如:Get-ChildItem -Path $path0| Where { $_.BaseName -Like "Export_$dval*"}| % { Write-Host 'Deleting' $_.FullName $dval; Remove-Item $_.FullName -Recurse }
    • 是的 - 它将传递相关文件并将它们删除。 Write-Host 需要一些格式 - 例如Write-Host "Deleting $($_.FullName) $dval"。此外,-Recurse 在您传递特定的完整路径时有点多余 - 如果您想在子文件夹中搜索匹配文件,它属于 Get-ChildItem
    • 我有-Recurse,因为在其他地方使用类似脚本进行测试时,我没有让文件名显示为被删除。添加它使它们出现。
    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多