web-dev-qa-db-ja.com

対話型PowerShellセッションの間、mkdirがオブジェクトを返さないオプションはありますか?

PowerShellのmkdirは、デフォルトで出力される作成済みディレクトリを返します。インタラクティブなPowerShellセッションでは、そのデフォルトによって少し混乱します。もちろん、出力を$nullにリダイレクトすることで、印刷をオフにすることができます。

mkdir $env:temp\foo > $null

ディレクトリを作成するたびにリダイレクトを記述したくないので、インタラクティブなPowerShellセッション中にコマンドレットがオブジェクトを返さないように設定できるオプションがあるかどうか疑問に思っています。

1

mkdirは_New-Item_をラップアラウンドする関数であるため、_function PSProvider_から取得して関数を編集し、変更して保存することができます。

このコマンドは、mkdirを実行したときに何が実行されるかを示します。

_Get-Item function:mkdir | Select-Object -ExpandProperty ScriptBlock
_

その後、実際にスクリプトブロックを変更して、再度保存できます。

mkdirを_New-Item_で囲む行は次のとおりです。

_$scriptCmd = {& $wrappedCmd -Type Directory @PSBoundParameters }_

それに_| Out-Null_を追加するだけで、魔法のようになります。次のような他のすべての出力抑制方法:

  • _null =_
  • _> null_
  • _[void]_

この場合、Microsoftはこの関数を作成するときにsteppablePipelineを使用したため、機能しません。

これにより、次のコードが残ります。

_function Set-Mkdir {

    [string]$Mkdir = Get-Item function:mkdir | Select-Object -ExpandProperty ScriptBlock

    $NewMkdir = $Mkdir.Replace('$scriptCmd = {& $wrappedCmd -Type Directory @PSBoundParameters }','$scriptCmd = {& $wrappedCmd -Type Directory @PSBoundParameters | Out-Null }')
    $NewMkdir = [ScriptBlock]::Create($NewMkdir)

    Set-item -Path function:mkdir -Value $NewMkdir

}
_

このメソッドは閉じたときに持続しないため、 PowerShellプロファイル に配置するための関数に配置しましたPowerShellを再度開きます。プロファイルに配置すると、必要に応じてインタラクティブなPowerShellセッションで実行できます。

Alias プロファイルでこれらの関数を実行し、次のように本当に必要な場合にのみ実行できます。

_Set-Alias smkdir -Value Set-Mkdir
Set-Alias rmkdir -Value Restore-Mkdir
_

編集:

「古い」mkdirを復元したい場合は、.Replace()引数を切り替えて再度実行する必要があります。そのための別の関数は、次のとおりです。

_function Restore-Mkdir {

    [string]$Mkdir = Get-Item function:mkdir | Select-Object -ExpandProperty ScriptBlock

    $NewMkdir = $Mkdir.Replace('$scriptCmd = {& $wrappedCmd -Type Directory @PSBoundParameters | Out-Null }','$scriptCmd = {& $wrappedCmd -Type Directory @PSBoundParameters }')
    $NewMkdir = [ScriptBlock]::Create($NewMkdir)

    Set-item -Path function:mkdir -Value $NewMkdir

}
_
1
SimonS