Создать временный каталог в PowerShell?

PowerShell 5 вводит , что очень удобно. Как я могу сделать то же самое, но вместо файла создать каталог? Есть ли ?

6 ответов


Я думаю, что это можно сделать без цикла, используя GUID для имени каталога:

function New-TemporaryDirectory {
    $parent = [System.IO.Path]::GetTempPath()
    [string] $name = [System.Guid]::NewGuid()
    New-Item -ItemType Directory -Path (Join-Path $parent $name)
}

Оригинальная Попытка С GetRandomFileName

вот мой порт это решение на C#:

function New-TemporaryDirectory {
    $parent = [System.IO.Path]::GetTempPath()
    $name = [System.IO.Path]::GetRandomFileName()
    New-Item -ItemType Directory -Path (Join-Path $parent $name)
}

Анализ Возможности Столкновения

насколько вероятно, что GetRandomFileName возвращает имя, которое уже существует в папке Temp?

  • имена файлов возвращаются в виде XXXXXXXX.XXX где X может быть либо a строчная буква или цифра.
  • это дает нам 36^11 комбинаций, что в битах составляет около 2^56
  • вызов парадокс дней рождения, мы ожидаем столкновения, как только мы добрались до 2^28 элементов в папке, что составляет около 360 миллионов
  • NTFS поддерживает около 2^32 элементов в папке, так что можно получить столкновение с помощью GetRandomFileName

NewGuid С другой стороны может быть одним из 2^122 возможности, что делает столкновения практически невозможно.


Я также люблю однострочные, и я прошу здесь downvote. Все, о чем я прошу, это выразить словами мои собственные смутные негативные чувства по этому поводу.

New-TemporaryFile | %{ rm $_; mkdir $_ }

вот моя попытка:

function New-TemporaryDirectory {
    $path = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())

    #if/while path already exists, generate a new path
    while(Test-Path $path)) {
        $path = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
    }

    #create directory with generated path
    New-Item -ItemType Directory -Path $path
}

.NET имел [System.IO.Path]::GetTempFileName() довольно долго; вы можете использовать это для создания файла (и захвата имени), а затем создать папку с тем же именем после удаления файла.

$tempfile = [System.IO.Path]::GetTempFileName();
remove-item $tempfile;
new-item -type directory -path $tempfile;

Я люблю один лайнеры, если это возможно. @alroc .NET также имеет [System.Guid]::NewGuid()

$temp = [System.Guid]::NewGuid();new-item -type directory -Path d:$temp

Directory: D:\


Mode                LastWriteTime     Length Name                                                                                                                        
----                -------------     ------ ----                                                                                                                        
d----          1/2/2016  11:47 AM            9f4ef43a-a72a-4d54-9ba4-87a926906948  

расширение из ответа Майкла Кропата:https://stackoverflow.com/a/34559554/8083582

Function New-TemporaryDirectory {
  $tempDirectoryBase = [System.IO.Path]::GetTempPath();
  $newTempDirPath = [String]::Empty;
  Do {
    [string] $name = [System.Guid]::NewGuid();
    $newTempDirPath = (Join-Path $tempDirectoryBase $name);
  } While (Test-Path $newTempDirPath);

  New-Item -ItemType Directory -Path $newTempDirPath;
  Return $newTempDirPath;
}

Это должно устранить любые проблемы с наездом.