PowerShell 技能连载 - 奇怪的 Cmdlet:New-TemporaryFile

这是一个 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
# load module that defines the function:
PS C:\> New-TemporaryFile -WhatIf
What if: Performing the operation "New-TemporaryFile" on target "C:\Users\tobia\AppData\Local\Temp".

# dump function source code:
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

PowerShell 技能连载 - 奇怪的 Cmdlet:New-TemporaryFile

http://blog.vichamp.com/2022/02/21/strange-cmdlet-new-temporaryfile/

作者

吴波

发布于

2022-02-21

更新于

2022-07-06

许可协议

评论