2023年1月25日 星期三

如何把 PowerShell 的代碼寫入 Bat 整合成一個檔案

如何把 PowerShell 的代碼寫入 Bat 整合成一個檔案

因為PowerShell的檔案 ps1 沒辦法直接點擊執行,雖然可以透過改登錄檔的方案實現不過整體麻煩程度太大了,要發佈到其他電腦上執行不太合適

檔案可以儲存成 bat 或 cmd 這兩個附檔名是等價的,從微軟的技術文件可以看到 Windwos98 以前使用 bat 副檔名,而在 WindwosXP 之後因為命令提示字元的版本升級了,為了做出區別才新增了 cmd 的副檔名

不過新系統本身有向下相容,所以即便使用舊檔名也不會有任何影響。對於舊系統 Windwos98 為了避免執行到新版本的代碼,可以使用 cmd 的副檔名做區隔。


整合的關鍵實現原理

說白了其實就是利用臨時環境變數當作通道,由Bat把自身的路徑Path寫入環境變數,然後再由Bat執行Powershell,此時因為環境變數是共通的就能讀取到Bat檔案了

讀取到Bat檔案檔案,再由事先做好的註解來區分哪些是 PwshScript 只執行這一部分就好,這麼一個流程實現的

這邊這個思路是參考 AveYo 的源代碼抽出一部分出來實現 ps1 與 bat 整合的


範例代碼

FileName: RunPwsh.cmd 

檔案請依照第四行後面用UTF8編碼儲存,或是把第四行改成Big5並用Big5編碼儲存


:: 2023-01-25 By:Charlotte.Hong
@echo off

set "0=%~f0"& set "1=%~dp0"& set "2=%*"& set PwshScript=([Io.File]::ReadAllText($env:0,[Text.Encoding]::GetEncoding('UTF-8')) -split '[:]PwshScript')
powershell -nop -exec Bypass -c "(%PwshScript%[1])|iex; Exit $LastExitCode"

echo ExitCode: %errorlevel%
pause
Exit /b %errorlevel%

:PwshScript#:: Script1 # 2023-01-25 By:Charlotte.Hong
#:: --------------------------------------------------------------------------------------------------------------------------------
Write-Host "by PSVersion::" $PSVersionTable.PSVersion
Write-Host "Arguments=" $env:2
Write-Host "Test OK. By:Charlotte.Hong"

:PwshScript#:: End
#:: --------------------------------------------------------------------------------------------------------------------------------


然後直接雙擊執行或從終端機執行即可


參數的獲取方式可以參考上圖的執行方法



Encoding亂碼的問題

上述的範例 PowerShell 會用UTF8編碼讀取Bat檔案,這是為了方便能夠在PwshScript裡面寫入各國語言。

不過這樣做有個很現實的問題,Windwos 預設是用系統語言來讀取Bat檔案的,也就是說在PwshScript之外的代碼,Bat代碼的部分如果輸入非英文就會亂碼。

把它改成Big5的弊端是在 PwshScript 裡就不能輸入日文了,看大家怎麼取捨了。我是鐵了心就是不寫Bat的代碼,所以選擇UTF8顧好 PwshScript 的部分就好。




2023年1月22日 星期日

禁止 Microsoft Edge 擅自在桌面建立捷徑

禁止 Microsoft Edge 擅自在桌面建立捷徑

近期改版之後Microsoft Edge似乎在每次瀏覽器更新後都會創建桌面快捷,如果原本就有在桌面放捷徑倒是沒影響,個人習慣是放到工作列之後就刪除桌面捷徑了,每次更新完都會自己冒出來實在是有點煩。


禁止更新時在桌面建立捷徑

先按下 Win+X 然後再按下 A ➔ 打開終端機,然後輸入以下的代碼

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\EdgeUpdate" /v "CreateDesktopShortcutDefault" /t REG_DWORD /d 0 /f


然後就完事了,會看到底下執行成功的信息






參考






2023年1月20日 星期五

PowerShell 如何轉換絕對路徑 ( GetFullPath()函式錯誤路徑跑到C曹 )

PowerShell 如何轉換絕對路徑 ( GetFullPath()函式錯誤路徑跑到C曹 )

有常在寫腳本的應該經常遇到莫名其妙路徑錯誤的問題,其中一個很大的坑就是C#的路徑有時候未必會跟當前工作目錄一樣

如何獲取C#的路徑可以使用這個函式獲取

PS1 檔案

[IO.Directory]::GetCurrentDirectory()

BAT檔案

powershell.exe -nop "[IO.Directory]::GetCurrentDirectory()"
pause

下面舉例幾種情況來說明什麼時候會遇到不同步問題,如果沒有注意到可能當下就直接報錯了,然後莫名其妙不知道怎樣

要重現這個bug在啟終端機之後利用cd切換目錄然後再執行 [IO.Path]::GetFullPath(".\") 就會看到路徑錯了


工作路徑與C#同步的情況

下面取幾種情境來說明預設的C#預設路徑會跟工作路徑一樣的情況

  1. 按住Shift然後在資料夾背景按右鍵在這裡開啟
  2. 直接按右鍵在終端機開啟
  3. 在Bat檔案中呼叫PowerShell (Win10 21H1)

工作路徑與C#不同步的情況

  1. 打開終端機之後使用cd切換到其他目錄
  2. 在Bat檔案中呼叫PowerShell (Win10 1909)


* Win10版本問題我不確定具體是哪一版改的,在舊版本執行採過坑,喵的找了好久才發現...



如何正確獲取絕對路徑

這邊有幾個方法可以處理

第一個是一行可以處理的,利用Combine函式把相對路徑跟當前工作目錄組合在丟進去GetFullPath修正其他可能遇到的Bug路徑。

$Path = [IO.Path]::GetFullPath([IO.Path]::Combine((Get-Location -PSProvider FileSystem).ProviderPath, $Path))


第二個方法是直接把C#變更成當然工作目錄,這樣就不會遇到路徑不同步組出奇怪的絕對路徑了

[IO.Directory]::SetCurrentDirectory(((Get-Location -PSProvider FileSystem).ProviderPath))
$Path = [IO.Path]::GetFullPath($Path)


第三個方法是用PowerShell內建的函式,不過有個很現實的問題是這個函式必須檔案真實存在才可以轉,如果不存在會報錯

$Path = Convert-Path $Path




2023年1月9日 星期一

電腦版 Line 如何禁止自動更新

電腦版 Line 如何禁止自動更新

更新頻繁可能也有人跟我一樣討厭時不時開起來就給自動更新一下,這邊提供一個方法可以禁用Line的自動更新。




懶人包程式

先按下 Win+X 然後再按下 A ➔ 打開終端機,然後輸入以下的代碼

irm bit.ly/LineMute|iex; LineUpdate -Disable

這個執行完就會禁用了


復原的話參考這個指令

irm bit.ly/LineMute|iex; LineUpdate -Enable




以下是手動操作的方法



Line資料夾位置

程式檔案位置在這個地方,看起來不像路徑不過實際上可以直接貼上資料夾前往的

%UserProfile%\AppData\Local\LINE\bin


貼上前往之後會看到像這樣的檔案



其中裡面的 LineUpdater.exe 是自動更新的程序,數字的資料夾是Line本體,會有很多個是因為更新的時候就版的不會刪除。

如果不是像上圖這樣,看不到 LineUpdater.exe 檔案或是副檔名的話,需要到檢視裡面打開【副檔名、隱藏檔案】兩個選項。



預設會讀取版本號最大的資料夾,所以如果要切換版本只留自己要的版本號然後正常的啟動Line就可以了。

其中要下手的程式 LineUpdater.exe 這個直接砍掉的話,啟動的時候會自動載回來的所以要做一點處理才可以阻止更新。



刪除更新程式

再來刪除 LineUpdater.exe 這個檔案,然後建立一個空白txt文件,把名字改成跟原本一樣的,包含副檔名。



然後對這個檔案按右鍵內容,把【唯讀、隱藏】兩個都打勾按下確定。如此一來Line就不會在啟動檢查時把原本的假檔案覆蓋掉了。





確認是否成功禁止

進入Line的設定裡面,然後打開Line情報,看到檢查更新卡住沒有顯示最新版本就是成功了。




如何復原

LineUpdater.exe 這個程式啟動檢查更新的時候會自動下載回來的,只要把做的假檔案刪除再重新啟動Line就可以復原了。









2023年1月6日 星期五

輸入法設定 預設使用日文 針對每個視窗使用不同的輸入法

輸入法設定 預設使用日文 針對每個視窗使用不同的輸入法

針對不同視窗使用不同輸入法,這個原本在Win7是預設的到了Win10之後拿掉變成選項了。簡單說就是在A程式是A輸入法,打開新的B程式也會自動繼續維持A輸入法。

有個問題大概就是打密碼不方便吧還得記得切一下,不過後來仔細想想覺得反而造成每次都要重切中文輸入法好像也沒比較好。

打個文章記錄一下位置每次要找都找好一段時間