Aşağıdaki durumlarda
bu cevap sizin için DEĞİLDİR :
- nadiren, eğer varsa, harici CLI'leri kullanmanız gerekir (genellikle uğraşmaya değer - PowerShell yerel komutları birlikte çok daha iyi oynar ve böyle bir özelliğe ihtiyaç duymazlar).
- Bash'in süreç ikamesine aşina değil.
Bu cevap size IS : eğer,
sık sık özellikle senaryo yazımı sırasında, (ister PowerShell yerli alternatifleri) iyiliği (olmaması alışkanlıktan veya bağlı) Dış CLIS kullanın -.
- Bash'in süreç ikamesinin neler yapabileceğini biliyor ve takdir ediyor.
- Güncelleme : Artık PowerShell, Unix platformlarında da desteklendiğine göre, bu özellik artan bir ilgi görüyor - GitHub'daki bu özellik isteğine bakınPowerShell'in, ikame işlemine benzer bir özellik uyguladığını gösterir.
Unix dünyasında, Bash / Ksh / Zsh içinde, bir süreç ikamesi bunun geçici sanki komut çıktısını tedavi teklifler olduğu dosya kendisini sonra temizler; örneğin cat <(echo 'hello')
, komuttan çıktıyı komut çıktısını içeren geçici bir dosyanın yolu olarak cat
görür .echo
PowerShell yerel komutlarının böyle bir özelliğe gerçek bir ihtiyacı olmamakla birlikte, harici CLI'lerle uğraşırken kullanışlı olabilir .
Özelliğin PowerShell'de taklit edilmesi zahmetlidir , ancak sık sık ihtiyaç duyduğunuzda buna değebilir.
cf
Bir komut dosyası bloğunu kabul eden, bloğu yürüten ve çıktısını bir sıcaklığa yazan bir işlev hayal edin. dosya istek üzerine oluşturulur ve temp döndürür. dosyanın yolu ; Örneğin:
findstr.exe "Windows" (cf { Get-ChildItem c:\ }) # findstr sees the temp. file's path.
Bu, böyle bir özelliğe olan ihtiyacı iyi göstermeyen basit bir örnektir . Belki de daha ikna edici bir senaryo, psftp.exe
SFTP transferleri için kullanımdır : toplu (otomatik) kullanımı , istenen komutları içeren bir girdi dosyası sağlamayı gerektirirken , bu tür komutlar anında bir dize olarak kolayca oluşturulabilir.
Mümkün olduğunca harici yardımcı programlarla olabildiğince uyumlu olması için sıcaklık. dosyada varsayılan olarak BOM (bayt sırası işareti) olmadan UTF-8 kodlaması kullanılmalıdır , ancak gerekirse UTF-8 BOM isteyebilirsiniz -BOM
.
Ne yazık ki, işlem ikamelerinin otomatik temizleme yönü doğrudan taklit edilemez , bu nedenle açık bir temizleme çağrısı gereklidir ; temizleme, cf
bağımsız değişkenler olmadan çağrılarak gerçekleştirilir :
İçin interaktif kullanım, sen yapabilirsiniz sizin için temizleme çağrısı ekleyerek temizleme otomatikleştirmek prompt
(şöyle fonksiyonu prompt
işlevi istemi döndürür dize , aynı zamanda arkası sahneleri gerçekleştirmek için kullanılabilir Bash en benzer istemi görüntülendiğinde her zaman, komutları $PROMPT_COMMAND
değişken); herhangi bir etkileşimli oturumda kullanılabilirlik cf
için PowerShell profilinize aşağıdakilerin yanı sıra aşağıdakilerin tanımını da ekleyin:
"function prompt { cf 4>`$null; $((get-item function:prompt).definition) }" |
Invoke-Expression
Komut dosyalarında kullanım için, temizlemenin gerçekleştirildiğinden emin olmak için, cf
- muhtemelen tüm komut dosyasını kullanan bloğun try
/ argümanına sarılması gerekir finally
; burada cf
, temizleme için bağımsız değişkenler çağrılmaz:
# Example
try {
# Pass the output from `Get-ChildItem` via a temporary file.
findstr.exe "Windows" (cf { Get-ChildItem c:\ })
# cf() will reuse the existing temp. file for additional invocations.
# Invoking it without parameters will delete the temp. file.
} finally {
cf # Clean up the temp. file.
}
İşte uygulanması gelişmiş fonksiyonu: ConvertTo-TempFile
ve özlü takma, cf
:
Not : New-Module
Fonksiyonu dinamik bir modül üzerinden tanımlamak için PSv3 + 'yı gerektiren fonksiyonun kullanılması , fonksiyon parametreleri ile geçirilen kod bloğunda referans verilen değişkenler arasında değişken çakışmaların olmamasını sağlar.
$null = New-Module { # Load as dynamic module
# Define a succinct alias.
set-alias cf ConvertTo-TempFile
function ConvertTo-TempFile {
[CmdletBinding(DefaultParameterSetName='Cleanup')]
param(
[Parameter(ParameterSetName='Standard', Mandatory=$true, Position=0)]
[ScriptBlock] $ScriptBlock
, [Parameter(ParameterSetName='Standard', Position=1)]
[string] $LiteralPath
, [Parameter(ParameterSetName='Standard')]
[string] $Extension
, [Parameter(ParameterSetName='Standard')]
[switch] $BOM
)
$prevFilePath = Test-Path variable:__cttfFilePath
if ($PSCmdlet.ParameterSetName -eq 'Cleanup') {
if ($prevFilePath) {
Write-Verbose "Removing temp. file: $__cttfFilePath"
Remove-Item -ErrorAction SilentlyContinue $__cttfFilePath
Remove-Variable -Scope Script __cttfFilePath
} else {
Write-Verbose "Nothing to clean up."
}
} else { # script block specified
if ($Extension -and $Extension -notlike '.*') { $Extension = ".$Extension" }
if ($LiteralPath) {
# Since we'll be using a .NET framework classes directly,
# we must sync .NET's notion of the current dir. with PowerShell's.
[Environment]::CurrentDirectory = $pwd
if ([System.IO.Directory]::Exists($LiteralPath)) {
$script:__cttfFilePath = [IO.Path]::Combine($LiteralPath, [IO.Path]::GetRandomFileName() + $Extension)
Write-Verbose "Creating file with random name in specified folder: '$__cttfFilePath'."
} else { # presumptive path to a *file* specified
if (-not [System.IO.Directory]::Exists((Split-Path $LiteralPath))) {
Throw "Output folder '$(Split-Path $LiteralPath)' must exist."
}
$script:__cttfFilePath = $LiteralPath
Write-Verbose "Using explicitly specified file path: '$__cttfFilePath'."
}
} else { # Create temp. file in the user's temporary folder.
if (-not $prevFilePath) {
if ($Extension) {
$script:__cttfFilePath = [IO.Path]::Combine([IO.Path]::GetTempPath(), [IO.Path]::GetRandomFileName() + $Extension)
} else {
$script:__cttfFilePath = [IO.Path]::GetTempFilename()
}
Write-Verbose "Creating temp. file: $__cttfFilePath"
} else {
Write-Verbose "Reusing temp. file: $__cttfFilePath"
}
}
if (-not $BOM) { # UTF8 file *without* BOM
# Note: Out-File, sadly, doesn't support creating UTF8-encoded files
# *without a BOM*, so we must use the .NET framework.
# [IO.StreamWriter] by default writes UTF-8 files without a BOM.
$sw = New-Object IO.StreamWriter $__cttfFilePath
try {
. $ScriptBlock | Out-String -Stream | % { $sw.WriteLine($_) }
} finally { $sw.Close() }
} else { # UTF8 file *with* BOM
. $ScriptBlock | Out-File -Encoding utf8 $__cttfFilePath
}
return $__cttfFilePath
}
}
}
İsteğe bağlı olarak bir çıktı [dosya] yolu ve / veya dosya adı uzantısı belirtebileceğinizi unutmayın.