这是一个 PowerShell(和 Windows PowerShell)中比较隐藏的 cmdlet:New-TemporaryFile
。看到这样一个相对无用的 cmdlet 成为 PowerShell 的一部分,真是令人惊讶。当你查看它的源代码时,实际上它内部只是调用了一个简单的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 PS C:\> New-TemporaryFile -WhatIf What if : Performing the operation "New-TemporaryFile" on target "C:\Users\tobia\AppData\Local\Temp" . PS C:\> $ {function:New-TemporaryFile } [CmdletBinding ( HelpURI ='https://go.microsoft.com/fwlink/?LinkId=526726' , SupportsShouldProcess =$true )] [OutputType ([System.IO.FileInfo ])] Param () Begin { try { if ($PSCmdlet .ShouldProcess($env:TEMP )) { $tempFilePath = [System.IO.Path ]::GetTempFileName() } } catch { $errorRecord = [System.Management.Automation.ErrorRecord ]::new($_ .Exception,"NewTemporaryFileWriteError" , "WriteError" , $env:TEMP ) Write-Error -ErrorRecord $errorRecord return } if ($tempFilePath ) { Get-Item $tempFilePath } }
它的核心是这样的:
1 2 PS > [System.IO.Path ]::GetTempFileName()C:\Users\tobia\AppData\Local\Temp\tmp671.tmp
方法具有误导性,因为它实际上在您每次调用它时都会创建一个新的临时文件。`New-TemporaryFile` 返回的是临时文件对象,而不是字符串路径,这更好地说明了上面的问题。它的本质上是这样的: 1 2 3 4 5 6 7 8 9 10 11 ```powershell PS C:\> Get-Item ([System.IO.Path]::GetTempFileName()) Directory: C:\Users\tobia\AppData\Local\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 26.01.2022 12:48 0 tmpC6DF.tmp