Create a temporary directory in PowerShell?
I think it can be done without looping by using a GUID for the directory name:
function New-TemporaryDirectory {
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
New-Item -ItemType Directory -Path (Join-Path $parent $name)
}
Original Attempt With GetRandomFileName
Here's my port of this C# solution:
function New-TemporaryDirectory {
$parent = [System.IO.Path]::GetTempPath()
$name = [System.IO.Path]::GetRandomFileName()
New-Item -ItemType Directory -Path (Join-Path $parent $name)
}
Analysis Of Possibility Of Collision
How likely is it that GetRandomFileName
will return a name that already exists in the temp folder?
- Filenames are returned in the form
XXXXXXXX.XXX
where X can be either a lowercase letter or digit. - That gives us 36^11 combinations, which in bits is around 2^56
- Invoking the birthday paradox, we'd expect a collision once we got to around 2^28 items in the folder, which is about 360 million
- NTFS supports about 2^32 items in a folder, so it is possible to get a collision using
GetRandomFileName
NewGuid
on the other hand can be one of 2^122 possibilities, making collisions all but impossible.
I also love one-liners, and I'm begging for a downvote here. All I ask is that you put my own vague negative feelings about this into words.
New-TemporaryFile | %{ rm $_; mkdir $_ }
Depending on the type of purist you are, you can do %{ mkdir $_-d }
, leaving placeholder to avoid collisions.
And it's reasonable to stand on Join-Path $env:TEMP $(New-Guid) | %{ mkdir $_ }
also.
Here's a variant of user4317867's answer. I create a new directory in the user's Windows "Temp" folder and make the temp folder path available as a variable ($tempFolderPath
):
$tempFolderPath = Join-Path $Env:Temp $(New-Guid)
New-Item -Type Directory -Path $tempFolderPath | Out-Null
Here's the same script available as a one-liner:
$tempFolderPath = Join-Path $Env:Temp $(New-Guid); New-Item -Type Directory -Path $tempFolderPath | Out-Null
And here's what the fully qualified temp folder path ($tempFolderPath
) looks like:
C:\Users\MassDotNet\AppData\Local\Temp\2ae2dbc4-c709-475b-b762-72108b8ecb9f