Yerel uygulamaları arıyorsanız, [Environment]::CurrentDirectoryPowerShell'in $PWDgeçerli dizini hakkında endişelenmeniz gerekir . Çeşitli nedenlerden dolayı, Set-Location veya Push-Location'ı seçtiğinizde PowerShell, işlemin geçerli çalışma dizinini ayarlamaz; bu nedenle, ayarlanmasını bekleyen uygulamalar (veya cmdlet'ler) çalıştırıyorsanız bunu yapmanız gerekir.
Bir komut dosyasında şunları yapabilirsiniz:
$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
Buna kusursuz bir alternatif yok. Birçoğumuz bilgi istemi fonksiyonumuza [Environment] :: CurrentDirectory öğesini ayarlamak için bir satır koyduk ... ancak bir betik içindeki konumu değiştirdiğinizde bu size yardımcı olmaz .
Bunun PowerShell tarafından otomatik olarak ayarlanmamasının nedeni hakkında iki not:
- PowerShell çok iş parçacıklı olabilir. Tek bir işlemde aynı anda çalışan birden çok Runspace (bkz. RunspacePool ve PSThreadJob modülü) olabilir. Her çalışma alanının kendi
$PWDmevcut çalışma dizini vardır, ancak yalnızca bir işlem ve yalnızca bir Ortam vardır.
- Tek iş parçacıklı olsanız bile,
$PWDher zaman yasal bir CurrentDirectory değildir (örneğin kayıt defteri sağlayıcısına CD yazabilirsiniz).
İsteminize koymak istiyorsanız (yalnızca ana çalışma alanında, tek iş parçacıklı çalışır), şunları kullanmanız gerekir:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
antbazı parametrelerle çağıran bir betik . Bu yüzdenantyapılandırma dosyasını doğru bulduğundan emin olmak için o klasörden aramam gerekiyor. İdeal olarak ben geçici olarak bu komut dosyası içinde yürütme dizini değiştirmek için bir şey arıyorum.