gpt4 book ai didi

powershell - 如何修复/加速 powershell 脚本?

转载 作者:行者123 更新时间:2023-12-01 22:58:05 25 4
gpt4 key购买 nike

我知道有 code review因为存在“加速”,但我还需要“修复”脚本的问题。

我从命令提示符(.bat)迁移到 Powershell(.ps1),因为我认为命令提示符很难为复杂的事情制作脚本。我听说 Powershell 可能比命令提示符有一些开销,但如果它足够快,我不在乎。

这是两个文件的链接,sdn.old.batsdn.new.ps1。我将它们放在粘贴站点中,因为它们足够长。

paste.gg

这是我的问题。

这部分需要很长时间才能运行。

$logs_loc = @(
"$Env:LocalAppdata"
"$Env:Appdata"
)
ForEach ($item in $logs_loc) {
Get-ChildItem -Path "$item\*" -Recurse -Force -Include *.log *.log.txt | Remove-Item -Force
}

大约需要 5 秒,我不知道为什么。这也没有做任何事情。此代码应删除 %Appdata%%LocalAppdata% 下的所有 *.log*.log.txt 文件>,但它不会删除任何内容。我测试了测试文件随机放置空白 *.log*.log.txt 但它们在运行后仍然存在。

我还没有测试我脚本的其他部分,所以可能存在另一个问题......


长话短说

  1. 我不知道为什么我的代码不起作用,而且运行时间也太长。
  2. 有什么可以“提高”速度的吗?

最佳答案

Otter's helpful answer已经解释了您当前代码的问题, -Include parameter需要 string[] (string array) 作为参数,如果你想将多个过滤器传递给参数,你需要用逗号分隔它们 , .参见 about_Arrays了解详情。

至于提高代码效率,您需要对 IO.Directory 进行 .NET API 调用。作为zett42在评论中指出或 IO.DirectoryInfo , 两个选项都有效但是后者输出 IO.FileInfo 而不是字符串。要处理文件夹递归,您可以使用 Queue<T> instance :

$env:LocalAppdata, $env:Appdata | & {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string] $Path
)

begin { $queue = [Collections.Generic.Queue[IO.DirectoryInfo]]::new() }
process { $queue.Enqueue($Path) }
end {
while($queue.Count) {
$dir = $queue.Dequeue()
foreach($filter in '*.log', '*.log.txt') {
$dir.EnumerateFiles($filter)
}
foreach($i in $dir.EnumerateDirectories()) {
$queue.Enqueue($i)
}
}
}
} -ErrorAction SilentlyContinue | Remove-Item -Force

.NET Core/PowerShell Core 7+ 中,由于 EnumerationOptions Class,这项任务大大简化了这使我们能够 Ignore Inaccessible文件和文件夹:

# IgnoreInaccessible is set to `$true` by Defaut.

$enum = [IO.EnumerationOptions]@{
RecurseSubdirectories = $true
AttributesToSkip = 2, 4, 1024, 512
}

$env:LocalAppdata, $env:Appdata | ForEach-Object {
foreach($filter in '*.log', '*.log.txt') {
[IO.Directory]::EnumerateFiles($_, $filter, $enum)
}
} | Remove-Item -Force

参见 this answer有关 AttributesToSkip 的详细信息.

关于powershell - 如何修复/加速 powershell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72509570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com