最近在终端中使用 powershell 非常卡,加载慢,输入命令慢,返回也慢。研究了一下发现%TEMP%下存在大量 PS 开头的.tmp 文件,删除后 powershell 就恢复正常了。
想在 powershell 开始前使用命令删除这些 tmp 文件,结果执行命令时一边删除一边又生成了同样多的 tmp 文件
gci $env:TEMP\PS*.tmp -File | % { ri $_.FullName -Force }
那么现在问题来了,如何阻止 powershell 生成这些文件呢
1
Tumblr 297 天前
我觉得首先要问一下为什么会生成这些 tmp 文件。。。
作为 ps 大户,每天和 ps 打交道的人,从来没遇到 OP 提到的问题。 甚至我刚才用 Everything 随手查了一下,ps*.tmp 的文件数量是 0 ,一个也没有。 |
2
hez2010 297 天前
powershell 不会自己生成那些 tmp 文件。你是不是装了什么第三方 powershell 的 module ?
|
3
geelaw 297 天前 via iPhone
比如楼主可以透露一下自己用的是哪个版本的 PowerShell ?文件名除了以 PS 开头还有什么特征,文件内容大概是什么样子的?建立一个新的用户账户再打开 PowerShell 会不会有此现象?不要期待 psychic debugging 。
另外在 Windows 上删除临时文件可以直接 del "$env:TEMP\ps*.tmp" -fo 可以推断是 Windows ,主要是因为默认情况下 macOS 和 Linux 都不是用 TEMP 环境变量表示临时目录的。 |
4
KIMI360 OP @geelaw 日常使用的是 windows terminal ,版本为 1.19.240130002 ,Powershell 版本 5.1.19041.3930 。
文件名类似这样:PS6C28.tmp ,PS6C29.tmp 。文件打开显示的是乱码: ぃ墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘蝥蒇狼昔摀锲勰容亱覚厴櫾墘覙厬詪厜嶖囧融蔺劾萏奶圐弃蒇狼蝸嬐媭厜嶖囧融蔺劾萏奶圐弃蒇狼蝸嬢媭€ぃ墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘墘 不管是在 wt 或者 powershell 中,只要执行命令就会生成。不加载 profile 也生成 默认加载的 module 如下 ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con... Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...} Script 2.0.0 PSReadline {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS... 加载 profile 的话 module 如下 ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con... Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...} Script 2.0.0 PSReadline {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS... Binary 1.1.0.0 PSScheduledJob {Add-JobTrigger, Disable-JobTrigger, Disable-ScheduledJob,... Manifest 2.0.0.0 PSWorkflow {New-PSWorkflowExecutionOption, New-PSWorkflowSession, nwsn} |
6
KIMI360 OP @hez2010 也就设置了补全和 startship
~~~powershell Set-PSReadlineKeyHandler -Chord Tab -Function MenuComplete if(get-command starship -errorAction SilentlyContinue){ Invoke-Expression (&starship init powershell) }else{ function Global:prompt { Write-Host("PS") -ForegroundColor 10 -NoNewLine " $PWD> " } } ~~~ |
7
geelaw 297 天前 via iPhone
@KIMI360 #6 不设置这些呢?
那些文件可能是某段代码反复调用 GetTempFileName 并设置 prefix 等于 PS 的结果,这个 Win32 API 的效果是在临时文件夹建立 <prefix><四位十六进制数>.tmp 的新文件,慢大概是因为重名太多所以每次调用都要反复尝试。 已知 Windows PowerShell 5.1 (从版本为 5.1 推断应该是 Windows PowerShell 而不是新的开源版 PowerShell )默认配置下(包括 PSReadLine 自动开启但没有其他配置)不会有这个现象。 另外可能的原因是实际上某段代码确实会建立这种临时文件,但也会同时删除,然而出于某些原因删除失败。楼主可以检查一下这些临时文件的访问控制权限,是否有拒绝某些安全主体删除,文件是否有只读、隐藏、系统属性。 |
8
KIMI360 OP @geelaw
1 、去除 profile 也会生成 2 、检查了 temp 的属性,确实有只读属性,去除后生成的临时文件未自动删除 3 、检查了 temp 的安全属性,SYSTEM 组,当前用户,Administrators 组均有完全控制的权限 4 、tmp 文件是在执行命令时生成的,执行一条命令会生成多个 tmp 文件。比如执行 ls ,当前目录下有 6 个文件夹,但是生成了 66 个 tmp 文件 |
9
geelaw 297 天前 via iPhone
@KIMI360 #8 第二个问题:应该检查的事 tmp 文件的属性,删除失败之后改变属性/权限,不会导致再次尝试删除。
另外的问题就是:新建一个用户并在新用户里运行 PowerShell ,这个问题在新用户里是否存在?这一步是要决定问题在于当前用户的配置还是当前系统的配置。新用户应该建立为非管理员账户。 |
10
KIMI360 OP @geelaw
1 、attrib tmp 文件 只有 A 属性 2 、新建普通本地用户使用 powershell 也会产生 tmp 文件 3 、操作系统为 Win10 企业版,使用 ISO 为我告诉你 Windows 10 (business editions), version 22H2 (updated Jan 2024),前两天刚重装的系统,之前也是因为 powershell 卡没找到原因才重装的 |
11
guzzhao 297 天前
我电脑也是执行一次命令生成几个文件文件名是这样的,Temp/3613DAE9-FDDD-4175-88B8-A492F651B7A9/PS.0LfarU8H.f9be.tmp
|
12
KIMI360 OP 会不会是系统版本本身的 bug 。毫无头绪,准备重装系统,看看是否系统的问题
|
13
geelaw 297 天前
你说的“不管是在 wt 或者 powershell 中”,后面一种是指 conhost.exe 里与 PowerShell 交互吗?卸载 Windows Terminal 会发生什么?
|
15
Tumblr 297 天前
我猜测是某个 module 或者你的某个 script 导致的,我自己用了多年 PowerShell ,从来没遇到过这种情况。
我一般会这样 troubleshoot: 1. 用 -noprofile 参数启动,清除 tmp 文件之后,看看会不会继续生成; 2. 查看生成文件的属性,尤其是 owner ,看看是 SYSTEM 生成的还是当前账号生成的; 3. 尝试用 Process Monitor 看看是否能找到生成的信息。 另外,我会把现象放到 Google 里,看看是不是有共性的问题出现。 |
16
rozbo 296 天前
我这 ps 启动加载也是需要 5 秒钟,忍不了换了 nushell 搭配 just ,爽的一批
|