Create a temporary directory in PowerShell?

前端 未结 8 1715
一生所求
一生所求 2021-02-01 14:36

PowerShell 5 introduces the New-TemporaryFile cmdlet, which is handy. How can I do the same thing but instead of a file create a directory? Is there a New-TemporaryDirec

相关标签:
8条回答
  • 2021-02-01 15:24

    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.

    0 讨论(0)
  • 2021-02-01 15:28

    .NET has had [System.IO.Path]::GetTempFileName() for quite a while; you can use this to generate a file (and the capture the name), then create a folder with the same name after deleting the file.

    $tempfile = [System.IO.Path]::GetTempFileName();
    remove-item $tempfile;
    new-item -type directory -path $tempfile;
    
    0 讨论(0)
提交回复
热议问题