本站建議搭配 Hover Zoom+ chrome 擴充套件,可自動放大圖片
( 站內文介紹: https://goo.gl/BnBSGa )
網站搜索不是很好用建議使用google底下括號內是範例,整串打進google搜索內;
[ site:https://charlottehong.blogspot.tw/ 你要搜索的內容 ]
2023年2月10日 星期五
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
然後就完事了,會看到底下執行成功的信息
參考
- Microsoft Edge 在每次更新後都會在桌面上創建一個快捷方式 [解決方法] - Deskmodder.de
- 如何阻止Microsoft Edge創建桌面快捷方式 - gHacks 技術新聞
- Microsoft Edge Update 原則文件 | Microsoft Learn
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#預設路徑會跟工作路徑一樣的情況
- 按住Shift然後在資料夾背景按右鍵在這裡開啟
- 直接按右鍵在終端機開啟
- 在Bat檔案中呼叫PowerShell (Win10 21H1)
工作路徑與C#不同步的情況
- 打開終端機之後使用cd切換到其他目錄
- 在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日 星期五
輸入法設定 預設使用日文 針對每個視窗使用不同的輸入法
2022年12月21日 星期三
2023 [Win11/Win10] 家用版如何停用自動更新? 不用第三方軟體
2023 [Win11/Win10] 家用版如何停用自動更新? 不用第三方軟體
家用版就算禁用服務也會在一時間之後又自己悄悄開啟。而就算手動安裝從 gpedit.msc(群組原則) 下手,基本上就是一點反應也沒有。
有嘗試過的人大概知道上面再講什麼XD
如果只是不想被自動升級到Win11,而不是禁用整個安全性更新可以參考這篇處理
CHG: 【禁止自動更新下載Win11】不想升級如何停留在Win10
打開終端機
操作是用命令的方式設置的,不過不用怕只是貼上一行並按執行而已
對於Win10可以用快捷鍵啟動
- 先先按下 Win+X 然後再按下 A ➔ 會自動打開終端機
新版 Win11 因為沒有快捷鍵換個方式開
- 對著開始(微軟標誌)按右鍵
- 然後選擇 終端機(系統管理員)
停用自動更新:: 方法1
這個是直接調整延遲更新的上限,除限制後就隨便調整了相當於禁用更新了。
調整設定裡圖形介面的暫緩上限 (天數自行調整)
# 設定暫緩更新的範圍上限到 90 天
irm bit.ly/SetWinUpd|iex; Set-WUPauseMax 90
# 復原暫緩更新的範圍上限設置
irm bit.ly/SetWinUpd|iex; Set-WUPauseMax -RestoreDefault
這個只是解除上限而以並沒有實際延緩更新,設定完畢之後需要自行到設定裡面延緩更新,或是接著執行下面的命令調整
暫緩更新 (天數自行調整)
# 暫緩更新 90 天
irm bit.ly/SetWinUpd|iex; Set-WUPause 90
# 復原暫緩更新設置
irm bit.ly/SetWinUpd|iex; Set-WUPause -RestoreDefault
停用自動更新:: 方法2
這個是比較強力的手段在緩存資料夾生成一個假檔案,藉此阻止系統下載更新。
irm bit.ly/StopWinUpdate|iex; StopWinUpdate -Stop
復原就把那假檔案砍掉就好了,對應的恢復代碼
irm bit.ly/StopWinUpdate|iex; StopWinUpdate -Default
方法2停用後的狀況
Win10 測試結果