我知道存在“加速”的代碼審查,但我還需要“修復”我的腳本的問題。
我從 Command Prompt( .bat) 遷移到 Powershell( .ps1),因為我認為 Command Prompt 很難為復雜的事情撰寫腳本。我聽說 Powershell 可能比命令提示符有一些開銷,但如果它足夠快,我不在乎。
這是兩個檔案的鏈接,sdn.old.bat和sdn.new.ps1. 我將它們放在粘貼站點中,因為它們足夠長。
粘貼.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 秒,我不知道為什么。這也沒有任何作用。此代碼應洗掉 and 下的所有or*.log檔案*.log.txt,但不會洗掉任何內容。我測驗了隨機放置空白的測驗檔案,但它們在運行后仍然存在。%Appdata%%LocalAppdata%*.log*.log.txt
我還沒有測驗我的腳本的其他部分,所以可能存在另一個問題......
TL;博士
- 我不知道為什么我的代碼不起作用,而且運行時間也太長。
- 有什么可以“提高”速度的嗎?
uj5u.com熱心網友回復:
Otter 的有用答案已經解釋了您當前代碼的問題,-Include引數采用string[](字串陣列)作為引數,如果您想將多個過濾器傳遞給您需要用逗號分隔它們的引數,。有關詳細資訊,請參閱about_Arrays。
至于提高代碼的效率,您需要進行 .NET API 呼叫,IO.DirectoryInfo正如zett42在評論中指出的那樣。為了處理檔案夾遞回,您可以使用Queue<T>:
$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 類允許我們忽略不可訪問的檔案和檔案夾,此任務大大簡化:
# 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
有關詳細資訊,請參閱此答案AttributesToSkip。
uj5u.com熱心網友回復:
問題是您的-include引數被解釋*.log *.log.txt為單個模式,但我們希望它匹配任何一個模式,所以只需用 a 分隔它們,,所以*.log, *.log.txt.
$logs_loc = @(
"$Env:LocalAppdata"
"$Env:Appdata"
)
ForEach ($item in $logs_loc) {
Get-ChildItem -Path "$item\*" -Recurse -Force -Include *.log, *.log.txt | Remove-Item -Force
}
至于速度,這似乎是一項您不會經常執行的操作,所以我不確定是否值得投入大量時間使其比現在更快,我的需要 10 秒。我建議為此要求 Code Review!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487120.html
標籤:电源外壳
