Создать временный каталог в 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;
}
Это должно устранить любые проблемы с наездом.