我正在學習 Windows PowerShell 并且我正在努力完成一個非常基本的任務,如何創建一個 .bat 檔案來更改當前目錄?帶有cd mydir內部的簡單 .bat 檔案使用運行良好cmd.exe,但它在 PowerShell 中不起作用:
PS C:\Users\ET\test> dir
Directory: C:\Users\ET\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 01/10/2021 10:57 mydir
-a---- 01/10/2021 10:58 10 changeDir.bat
PS C:\Users\ET\test> type changeDir.bat
cd mydir
PS C:\Users\ET\test> .\changeDir.bat
C:\Users\ET\test>cd mydir
PS C:\Users\ET\test>
你看到我的當前目錄在執行 .bat 檔案后沒有改變。使用cmd.exe以下方法按預期作業:
C:\Users\ET\test>changeDir
C:\Users\ET\test>cd mydir
C:\Users\ET\test\mydir>
uj5u.com熱心網友回復:
由于批處理檔案 ( .bat, .cmd) 在子行程(via cmd.exe) 中運行,因此您基本上無法使用它更改PowerShell 的當前目錄。
- 這適用于在子行程中運行的所有呼叫,即所有外部程式呼叫和對由非 PowerShell 本身的腳本引擎解釋的腳本的呼叫。
- 當子行程的作業目錄被改變時,這對呼叫者(父行程)沒有影響,并且沒有允許給定行程改變其父行程的作業目錄的內置機制(這將是一個危險的功能) .
下一個最好的事情是讓您的.bat檔案回顯(輸出)所需作業目錄的路徑,并將結果傳遞給 PowerShell 的Set-Locationcmdlet。
# Assuming that `.\changeDir.bat` now *echoes* the path of the desired dir.
Set-Location -LiteralPath (.\changeDir.bat)
通過cmd /c呼叫模擬批處理檔案輸出的簡化示例:
Set-Location -LiteralPath (cmd /c 'echo %TEMP%')
如果您正在尋找導航到給定目錄的簡短便捷命令,請不要使用批處理檔案 -而是使用PowerShell腳本或函式;例如:
function myDir { Set-Location -LiteralPath C:\Users\ET\test\myDir }
執行myDir然后導航到指定的目錄。
您可以將此功能添加到您的$PROFILE檔案中,以便在以后的會話中也自動使其可用。
您可以$PROFILE在文本編輯器中打開或以編程方式添加函式,如下所示,以確保按需創建檔案及其父目錄:
# Make sure the $PROFILE file exists.
If (-not (Test-Path $PROFILE)) { $null = New-Item -Force $PROFILE }
# Append the function definition to it.
@'
function myDir { Set-Location -LiteralPath C:\Users\ET\test\myDir }
'@ | Add-Content $PROFILE
uj5u.com熱心網友回復:
嘗試以下
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
Write-host "running in directory $dir"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312641.html
