V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KIMI360
V2EX  ›  PowerShell

求助:如何阻止 Powershell 生成 tmp 文件

  •  
  •   KIMI360 · 2024-02-08 09:41:54 +08:00 · 2111 次点击
    这是一个创建于 378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在终端中使用 powershell 非常卡,加载慢,输入命令慢,返回也慢。研究了一下发现%TEMP%下存在大量 PS 开头的.tmp 文件,删除后 powershell 就恢复正常了。

    想在 powershell 开始前使用命令删除这些 tmp 文件,结果执行命令时一边删除一边又生成了同样多的 tmp 文件

    gci $env:TEMP\PS*.tmp -File | % { ri $_.FullName -Force }
    

    那么现在问题来了,如何阻止 powershell 生成这些文件呢

    16 条回复    2024-02-08 21:05:06 +08:00
    Tumblr
        1
    Tumblr  
       2024-02-08 10:23:15 +08:00
    我觉得首先要问一下为什么会生成这些 tmp 文件。。。
    作为 ps 大户,每天和 ps 打交道的人,从来没遇到 OP 提到的问题。
    甚至我刚才用 Everything 随手查了一下,ps*.tmp 的文件数量是 0 ,一个也没有。
    hez2010
        2
    hez2010  
       2024-02-08 10:26:13 +08:00
    powershell 不会自己生成那些 tmp 文件。你是不是装了什么第三方 powershell 的 module ?
    geelaw
        3
    geelaw  
       2024-02-08 10:40:01 +08:00 via iPhone
    比如楼主可以透露一下自己用的是哪个版本的 PowerShell ?文件名除了以 PS 开头还有什么特征,文件内容大概是什么样子的?建立一个新的用户账户再打开 PowerShell 会不会有此现象?不要期待 psychic debugging 。

    另外在 Windows 上删除临时文件可以直接 del "$env:TEMP\ps*.tmp" -fo

    可以推断是 Windows ,主要是因为默认情况下 macOS 和 Linux 都不是用 TEMP 环境变量表示临时目录的。
    KIMI360
        4
    KIMI360  
    OP
       2024-02-08 11:06:45 +08:00
    @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}
    KIMI360
        5
    KIMI360  
    OP
       2024-02-08 11:08:13 +08:00
    @Tumblr 我也很奇怪,不知道是什么设置导致的该问题。现象就是 powershell 用一段时间就非常卡。卡到怀疑人生
    KIMI360
        6
    KIMI360  
    OP
       2024-02-08 11:12:21 +08:00
    @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> "
    }
    }
    ~~~
    geelaw
        7
    geelaw  
       2024-02-08 11:38:38 +08:00 via iPhone
    @KIMI360 #6 不设置这些呢?

    那些文件可能是某段代码反复调用 GetTempFileName 并设置 prefix 等于 PS 的结果,这个 Win32 API 的效果是在临时文件夹建立 <prefix><四位十六进制数>.tmp 的新文件,慢大概是因为重名太多所以每次调用都要反复尝试。

    已知 Windows PowerShell 5.1 (从版本为 5.1 推断应该是 Windows PowerShell 而不是新的开源版 PowerShell )默认配置下(包括 PSReadLine 自动开启但没有其他配置)不会有这个现象。

    另外可能的原因是实际上某段代码确实会建立这种临时文件,但也会同时删除,然而出于某些原因删除失败。楼主可以检查一下这些临时文件的访问控制权限,是否有拒绝某些安全主体删除,文件是否有只读、隐藏、系统属性。
    KIMI360
        8
    KIMI360  
    OP
       2024-02-08 12:32:46 +08:00
    @geelaw
    1 、去除 profile 也会生成
    2 、检查了 temp 的属性,确实有只读属性,去除后生成的临时文件未自动删除
    3 、检查了 temp 的安全属性,SYSTEM 组,当前用户,Administrators 组均有完全控制的权限
    4 、tmp 文件是在执行命令时生成的,执行一条命令会生成多个 tmp 文件。比如执行 ls ,当前目录下有 6 个文件夹,但是生成了 66 个 tmp 文件
    geelaw
        9
    geelaw  
       2024-02-08 12:41:56 +08:00 via iPhone
    @KIMI360 #8 第二个问题:应该检查的事 tmp 文件的属性,删除失败之后改变属性/权限,不会导致再次尝试删除。

    另外的问题就是:新建一个用户并在新用户里运行 PowerShell ,这个问题在新用户里是否存在?这一步是要决定问题在于当前用户的配置还是当前系统的配置。新用户应该建立为非管理员账户。
    KIMI360
        10
    KIMI360  
    OP
       2024-02-08 13:28:21 +08:00
    @geelaw
    1 、attrib tmp 文件 只有 A 属性
    2 、新建普通本地用户使用 powershell 也会产生 tmp 文件
    3 、操作系统为 Win10 企业版,使用 ISO 为我告诉你 Windows 10 (business editions), version 22H2 (updated Jan 2024),前两天刚重装的系统,之前也是因为 powershell 卡没找到原因才重装的
    guzzhao
        11
    guzzhao  
       2024-02-08 13:43:56 +08:00
    我电脑也是执行一次命令生成几个文件文件名是这样的,Temp/3613DAE9-FDDD-4175-88B8-A492F651B7A9/PS.0LfarU8H.f9be.tmp
    KIMI360
        12
    KIMI360  
    OP
       2024-02-08 13:47:45 +08:00
    会不会是系统版本本身的 bug 。毫无头绪,准备重装系统,看看是否系统的问题
    geelaw
        13
    geelaw  
       2024-02-08 15:10:51 +08:00
    你说的“不管是在 wt 或者 powershell 中”,后面一种是指 conhost.exe 里与 PowerShell 交互吗?卸载 Windows Terminal 会发生什么?
    KIMI360
        14
    KIMI360  
    OP
       2024-02-08 15:20:59 +08:00
    @geelaw 已重装系统,重装后未出现产生 tmp 文件的现象,证明非系统 bug 。后续我再观察一下吧,看看是什么导致了这个问题。非常感谢你的帮助
    Tumblr
        15
    Tumblr  
       2024-02-08 18:11:04 +08:00
    我猜测是某个 module 或者你的某个 script 导致的,我自己用了多年 PowerShell ,从来没遇到过这种情况。

    我一般会这样 troubleshoot:
    1. 用 -noprofile 参数启动,清除 tmp 文件之后,看看会不会继续生成;
    2. 查看生成文件的属性,尤其是 owner ,看看是 SYSTEM 生成的还是当前账号生成的;
    3. 尝试用 Process Monitor 看看是否能找到生成的信息。

    另外,我会把现象放到 Google 里,看看是不是有共性的问题出现。
    rozbo
        16
    rozbo  
       2024-02-08 21:05:06 +08:00
    我这 ps 启动加载也是需要 5 秒钟,忍不了换了 nushell 搭配 just ,爽的一批
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5396 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:53 · PVG 14:53 · LAX 22:53 · JFK 01:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.