49

PowerShell 5 では、New-TemporaryFile便利なコマンドレットが導入されました。ファイルの代わりにディレクトリを作成して同じことを行うにはどうすればよいですか? New-TemporaryDirectoryコマンドレットはありますか?

4

9 に答える 9

70

ディレクトリ名に 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一時フォルダーに既に存在する名前を返す可能性はどのくらいありますか?

  • ファイル名はXXXXXXXX.XXX、X が小文字または数字の形式で返されます。
  • これにより、36^11 の組み合わせが得られ、ビット単位では約 2^56 になります。
  • 誕生日のパラドックスを呼び出すと、フォルダ内のアイテム数が約 2^28、つまり約 3 億 6000 万になると、衝突が発生することが予想されます。
  • NTFS は 1 つのフォルダーで約 2^32 個のアイテムをサポートするため、次を使用して衝突が発生する可能性がありますGetRandomFileName

NewGuid一方、 2^122 の可能性のうちの 1 つになる可能性があり、衝突はほぼ不可能になります。

于 2016-01-01T19:59:35.177 に答える
3

.NET は[System.IO.Path]::GetTempFileName()かなり長い間使用されてきました。これを使用してファイルを生成し(および名前をキャプチャして)、ファイルを削除した後に同じ名前のフォルダーを作成できます。

$tempfile = [System.IO.Path]::GetTempFileName();
remove-item $tempfile;
new-item -type directory -path $tempfile;
于 2016-01-01T21:03:23.767 に答える