Windows 板


LINE

準確來說是把程式目錄新增至環境變數 PATH 之中, 方便在終端機中使用檔名或 basename 呼叫程式並執行。 但當程式越來越多後 PATH 就會變得越來越臃腫。 為了保持 PATH 簡潔,需要統一使用同一個目錄,我嘗試了以下方法。 方法 1. 在同一目錄下放置所有程式的子目錄、檔案 這是最簡單粗暴的方法 但,由於所有程式的子目錄與檔案都混在一起, 可能遇到檔案衝突,且管理上也很不方便。 方法 2. 在同一目錄建立目標程式的符號連結 PowerShell: -------- New-Item -ItemType SymbolicLink -Path program1.exe -Target "C:\My Programs\pro gram1\program1.exe" -------- 符號連結的好處是簡單且方便管理。 但通過符號連結執行程式會因為找不到依賴的檔案 (例如 dll 檔) 而無法正常執行, 所以只適合用於單 exe 檔的程式。 或者,要為所有項目也建立符號連結。 但這可能會與其他程式的同名子目錄或檔案的符號連結衝突。 方法 3. 在同一目錄下建立執行目標程式的 bat 檔案 program1.bat: -------- @echo off "C:\My Programs\program1\program1.exe" %* exit /b %ERRORLEVEL% -------- bat 檔的好處是可以使用 set 命令預先設定必要的臨時環境參數。 但使用 bat 檔會遇到一個棘手的問題。 由於 bat 的 args 需要按照 cmd 的方式跳脫字元, 這導致我必須重寫現有 powershell 腳本裡的受影響的程式的執行命令。 或者必須在 bat 內就跳脫所有特殊字元, 但 cmd 貧弱的字串處理能力,還有一堆例外狀況,想到就讓人怯步… 以上三種方法無論是哪一種都有缺點 搞了半天還是乖乖往 PATH 內新增每個程式的目錄比較實際... 有沒有人知道更加漂亮的解決方式? -- Sent from PTTopia --
QR Code



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.231.152.70 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Windows/M.1714045005.A.193.html
1F:推 smallreader: PATH為什麼會嫌太雜亂?太長再新增一行就好了吧04/25 19:51
2F:→ smallreader: 啊 第二個方法 改用python就不怕跳脫字元了04/25 20:00
3F:→ smallreader: subprocess.run(["路徑"]+sys.argv[1:])04/25 20:18
python 腳本的問題就是在 powershell 或 cmd 無法只使用 basename 呼叫並執行 PS> .\program # 執行名為 program 的可執行檔,例如 program.bat PS> python .\program.py # 執行 python 腳本 program.py 這會導致我要需要重寫我所有的 powershell 腳本
4F:推 tonyhsie: 正常都是1搭配3吧 大部分單一執行檔集中在一個目錄04/26 14:06
5F:→ tonyhsie: 少部分一堆檔案的程式 改用批次檔 放在跟1同一目錄下04/26 14:07
微軟自己的 winget 安裝 Console 程式就是在同一資料夾為所有 exe 檔建立符號連結 遺失依賴檔案的問題在 GitHub 上也是個開啟中的 Issue
6F:→ tonyhsie: 你如果會寫C#的話 可以不要用bat 自己寫個簡單的殼就好04/26 14:10
7F:→ tonyhsie: 殼作的事就是單純切目錄跟傳遞參數而已04/26 14:11
8F:→ tonyhsie: 然後把殼集中放在同一目錄下就好04/26 14:11
這個方法稍微嘗試一下,目前還沒發現什麼問題
9F:推 giacch: 若是Windows, 就是安裝程式, 建立"捷徑" 04/26 14:18
10F:推 giacch: 純Console環境, 不是管理PATH, 就是要弄出類似"捷徑"的BAT04/26 14:21
11F:推 giacch: PATH新增C:\BIN, BIN底下建立各程式的BAT(當捷徑用)04/26 15:58
12F:→ giacch: BAT 內容包含 CD PathToProgram 與 Program.exe04/26 15:59
13F:推 giacch: 更正 Program.exe %* 不要"號04/26 16:01
問題不於如何執行目標程式,而是如何跳脫 args 中的所有特殊字元 例如在 powershell 用 ffmpeg 轉換影片格式 原始 ffmpeg.exe PS> .\ffmepg -i input.mp4 ^outpu.mkv # 實際輸出檔案名稱為 "^outpu.mkv" ffmpeg.bat PS> .\ffmpeg -i input.mp4 ^outpu.mkv # 實際輸出檔案名稱為 "outpu.mkv" ※ 編輯: falcon (118.231.152.70 臺灣), 04/26/2024 21:07:30
14F:→ smallreader: https://i.imgur.com/cfRGvg2.png 寫寫存成ffmpeg.py 04/26 21:25
15F:→ smallreader: 檔名.py可以直接呼叫檔名不帶.py 前面也不用叫python04/26 21:37
16F:→ smallreader: 我這邊py檔案都是打basename就能執行的耶04/26 21:46
17F:→ smallreader: PS> (Get-Command ffmpeg).path =>也會回傳ffmpeg.py04/26 22:23
18F:→ smallreader: 只要副檔名有註冊用python開啟就能這樣替代04/26 22:24
19F:推 giacch: # Program.ps104/26 23:09
20F:→ giacch: Push-Location C:\Windows04/26 23:09
21F:→ giacch: & CMD.EXE /C "DIR NOTEPAD.EXE"04/26 23:09
22F:→ giacch: Pop-Location04/26 23:09
23F:推 giacch: 我忘了要傳參數 04/26 23:37
24F:→ giacch: & CMD.EXE /C DIR $ARGS # CMD 那行改這樣04/26 23:37
25F:→ giacch: Program.ps1 /B NOTEPAD.EXE # 這樣執行04/26 23:38
26F:推 smallreader: 樓上..只要還經過cmd 答案就不及格04/27 00:22
27F:推 smallreader: 欸...不對啊,所以方法3用ps寫不就解決了04/27 00:32
28F:→ smallreader: & "路徑" $args #存成.ps104/27 00:35
我發現搞錯一點了 還以為有名的參數一定要在 param() 內先宣告 不知道沒有宣告的都會被丟到 $args 那就奇怪了... 微軟的 winget 安裝 console 程式怎麼怎麼不用 .ps1 檔取代 links 目錄下的符號連結 這樣就不會因為程式找不到依賴檔案而無法正常執行了
29F:推 giacch: 對呀 都能執行 CMD 了 就執行你想執行的程式就好啦04/27 00:38
30F:→ smallreader: 至於cd完全是多餘動作,不需要 04/27 00:40
※ 編輯: falcon (118.231.152.70 臺灣), 04/27/2024 00:59:44
31F:→ falcon: 雖然還不曉得會不會引發其他問題 04/27 01:03
32F:→ falcon: 總之,先感謝各位提供的方法 04/27 01:03
33F:推 smallreader: 更正,原來打basename認得到.py為可執行檔,是因為系 04/27 02:17
34F:→ smallreader: 統變數的PATHEXT裡面有包含.PY,然後雖然PATHEXT不包 04/27 02:17
35F:→ smallreader: 含.PS1,但因為殼層用PS,所以他自己會額外去找.PS104/27 02:17
對了 順便問題下 遇到 Linux 移植過來的程式,那些 share 的檔案要放哪裡? 通常是 config 或 preset 檔案 在 linux 中,我記得預設目錄位置是 /usr/local/share/<program name> 使用時只要給程式檔名或 basename 就可以了 但在 Windows 下如果不把工作目錄切過去 好像就只能使用絕對路徑了? ※ 編輯: falcon (118.231.152.70 臺灣), 04/27/2024 03:27:27
36F:推 smallreader: 你的意思是/usr/local/bin吧,這個它有在PATH裡面04/27 18:31
37F:→ smallreader: share就對到家目錄的AppData04/27 18:37
試過許多路徑與環境變數都沒用 看起來有些程式並沒有為 Windows 設定程式資料目錄 只能在 .ps1 檔內自動修改目標參數的值了 param ([Alias('pre')][string]$preset) $programArgs = $args if (-not !$preset) { Push-Location 'C:\My Programs\program1\presets' $absConfigPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($preset) Pop-Location $programArgs += @('-pre', """$($absConfigPath)""") } & "C:\My Programs\program1\bin\program1.exe" $programArgs exit $lastExitCode ※ 編輯: falcon (118.231.152.70 臺灣), 04/28/2024 15:15:11
38F:→ hunandy14: 你那方法3 "cmd 的方式跳脫字元" 啥意思有範例嗎04/29 11:54
39F:→ hunandy14: 然後環境被限制在cmd嗎? 如果是powershell的話有其他解04/29 11:54
40F:→ hunandy14: 上面的pwsh 那樣寫有隱患 會被當作一大串字傳遞04/29 11:55
以 % 字元為例,在 cmd 必須 %% 來代表一個 % 常值字元 powershell 或 bash 中 ffmpeg -i input.mkv frame-%d.png cmd 中 ffmpeg -i input.mkv frame-%%d.png 其他特殊字元若要表示為常值則是要在前面加上 ^ 字元 還有一些奇奇怪怪的例外除理方式... 關於 powershell 腳本 目前已發現的問題是在就發現就是使用了 param() 後 一旦傳入了未在 param() 中宣告的參數並不會被存入 $args 變數中 而是會發生錯誤 「參數無法處理,因為 '???' 參數名稱不明確......」 ※ 編輯: falcon (39.10.17.37 臺灣), 04/29/2024 22:56:27
41F:→ falcon: 但這個問題拿掉param(),從$args中找出目標參數的值取代為04/29 23:31
42F:→ falcon: 絕對路徑就好了。我現在開始覺得用腳本管理環境變數PATH還04/29 23:31
43F:→ falcon: 比較實際點…04/29 23:31
44F:→ falcon: 之前就是那樣做的04/29 23:31
45F:→ hunandy14: 一個比較無腦的辦法是利用臨時環境變數來處理04/30 09:56
46F:→ hunandy14: 要用bat難度在於轉送參數,覺得一定會有東西丟失04/30 09:57
47F:→ hunandy14: 要是環境沒限制在cmd說實在話ps1不用煩惱內建就有$args04/30 10:02
48F:→ hunandy14: 咦不對呀試了一下需要處理的只有引號,跳脫不用處理吧04/30 10:16
49F:→ falcon: bat的args一定跳脫字元,無論在cmd還是powershell環境中04/30 13:38
50F:→ falcon: 例如%^都是cmd中則是特殊字元,這導致ffmpeg輸出frame為個04/30 13:38
51F:→ falcon: 圖片時別無法將檔名中的%d擴展為0,1,2,3...04/30 13:38
52F:→ falcon: 另外,我還發現ps1要實現pipeline功能似乎必須用到param()04/30 13:40
53F:→ falcon: 一旦使用param()就必須為爲目標程式所有參數也宣告變數04/30 13:44
54F:→ hunandy14: 可以傳進去拉 https://i.imgur.com/0ApuLRi.png04/30 16:32
例如這個例子執行時會發生錯誤 ffmpeg.exe -i input.mkv frame-%d.png 只會得到第一個畫面的圖片 frame-d.png 與輸出路徑格式錯誤訊息 必須讓程式收到 args 長下面這個樣子 ffmpeg.exe -i input.mkv frame-%%d.png 因為 % 在 cmd 中有特殊意義 例如 %~d1 為 bat 將 arg1 路徑擴展為磁碟機代號
55F:→ hunandy14: param() 的問題就我前面跟你說的有隱患04/30 16:33
56F:→ hunandy14: 要嘛自己拆,要嘛用內建的$args一次收全部04/30 16:34
*[32m※ 編輯: falcon (39.10.17.37 臺灣), 05/01/2024 11:50:37*[m
57F:→ hunandy14: 那是取決於你在哪裡,如果在命令提示字元只需要一個% 05/01 13:40
58F:→ hunandy14: 如果在bat文檔中由於讀取的時候會解析,必須要%% 05/01 13:41
59F:→ hunandy14: %d應該是ffmpeg的功能而不是bat的功能,所以他只收一個 05/01 13:41
60F:→ hunandy14: %*確認可以收到參數了,應該是能證實代理是可行的 05/01 13:45
61F:→ hunandy14: 代理是轉送不會過bat解析,理論上應該只需要輸入一個 05/01 13:49
62F:→ hunandy14: https://i.imgur.com/q6hu08x.png 05/01 14:12
我理解你所說的,我之前也是這樣做 但我再嘗試了一次,沒有發生錯誤 也找不到重現問題的關鍵點在哪裡...... 還是自動新增程式目錄到 PATH 比較省事... $programDirPaths = $env:PATHEXT -split ';' | % {"*$($_)"} | Get-ChildItem -Include $_ -Recurse | % {$_.DirectoryName} | Sort-Object -Unique $newEnvPathVal = (([Environment]::GetEnvironmentVariable( "Path", "Machine") -split ';') + $programDirPaths) -join ';' [Environment]::SetEnvironmentVariable("Path", $newEnvPathVal, "Machine") ※ 編輯: falcon (39.10.17.37 臺灣), 05/01/2024 21:30:08
63F:→ falcon: 我還發現 $p.StartInfo.FileName="basename" 不適用 bat 05/01 21:47
64F:推 hunandy14: 摁搞不定的話就直接無腦加吧 05/02 07:59







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP