我想在登錄時使用批處理腳本在適用于 Linux 的 Windows 子系統中啟動 Docker。當我以管理員身份運行批處理檔案時,它可以作業。所以我遵循了這個指南:在 Windows 10 中始終以管理員身份運行批處理檔案
然后我將快捷方式放入Startup檔案夾中。腳本已啟動,但它始終在第一行退出。
然后我嘗試在FreeCommander 中手動運行批處理檔案。當我通過右鍵單擊背景關系選單項以管理員身份運行腳本時,批處理腳本有效。但是當我雙擊運行批處理腳本時會輸出錯誤訊息。輸出錯誤資訊是:
命令“wsl”拼寫錯誤或找不到。
這是批處理腳本:
FOR /F "tokens=* USEBACKQ" %%g IN (`wsl.exe sh -c "hostname -I"`) do (SET "ip=%%g")
netsh interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%ip%
wsl sh -c "sudo dockerd -H tcp://%ip%"
我也徹底洗掉了一次 Windows Subsystem for Linux 并重新安裝了它,但問題仍然存在。
uj5u.com熱心網友回復:
應首先閱讀以下 Microsoft 檔案頁面:
- WOW64 實作細節
- 檔案系統重定向器
- 受 WOW64 影響的注冊表項
AMD64 架構處理器的 64 位 Windows 上有兩個系統目錄:
%SystemRoot%\System3264 位應用程式默認使用 64 位應用程式。%SystemRoot%\SysWOW6432 位應用程式默認使用 32 位應用程式。
該系統環境變數PATH包含Windows默認%SystemRoot%\System32的第一個檔案夾路徑。如果 32 位應用程式開始cmd.exe處理批處理檔案,則會%SystemRoot%\SysWOW64\cmd.exe因為檔案系統重定向器而啟動 32 位。
cmd.exe正在使用本地環境變數搜索批處理檔案中指定的檔案,僅使用檔案名,不帶或帶檔案擴展名,不帶路徑PATHEXT,PATH如“X 未被識別為內部或外部命令的原因是什么”的詳細說明、可運行的程式或批處理檔案”?
wsl.exe屬于在 AMD64 Windows 上僅作為 64 位版本存在的可執行檔案集%SystemRoot%\System32。由于檔案系統重定向器,在本地以擴展形式使用時,%SystemRoot%\SysWOW6432 位搜索沒有 32 位版本。因此,問題中發布的批處理檔案不適用于 Windows x64 上的 32 位處理。cmd.exe%SystemRoot%\System32 PATHcmd.exe
解決方案是將 WOW64 與批處理檔案中的附加代碼一起考慮在內:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%\System32\wsl.exe set "FileNameWSL=%SystemRoot%\System32\wsl.exe" & goto RunWSLCommands
if exist %SystemRoot%\Sysnative\wsl.exe set "FileNameWSL=%SystemRoot%\Sysnative\wsl.exe" & goto RunWSLCommands
echo ERROR: Could not find wsl.exe. Script execution aborted.
@setlocal EnableDelayedExpansion & for /F "tokens=1,2" %%G in ("!CMDCMDLINE!") do @endlocal & if /I "%%~nG" == "cmd" if /I "%%~H" == "/c" pause
exit /B
:RunWSLCommands
for /F "tokens=*" %%g in ('%FileNameWSL% sh -c "hostname -I"') do set "ip=%%g"
%SystemRoot%\System32\netsh.exe interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%ip%
%FileNameWSL% sh -c "sudo dockerd -H tcp://%ip%"
endlocal
要了解使用的命令及其作業原理,請打開命令提示符視窗,在那里執行以下命令,并仔細閱讀為每個命令顯示的所有幫助頁面。
echo /?endlocal /?exit /?for /?goto /?if /?netsh /?netsh interface /?netsh interface portproxy /?netsh interface portproxy add /?netsh interface portproxy add v4tov4 /?pause /?set /?setlocal /?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369171.html
下一篇:不要在復制時覆寫現有檔案
