2025年5月11日 星期日

Skype 轉到 Tesms 之後沒花完的數點怎麼辦 (其實還能用)

Skype 轉到 Tesms 之後沒花完的數點怎麼辦 (其實還能用)

兩個方法一個是從 teams 裡面進去,有個撥號鍵盤可以打
另一個是直接存取網址 (teams也是從網址打的)


https://calling.web.skype.com/

這裡進去有個簡易版本 skype 可以用


從這裡就可以打了,不過無法儲值用完為止,服務到什麼時候未知趕緊打完吧


另外有發現如果從網頁登入 teams 或是 安卓的 app 登入都會被要求綁定新信箱
這個信箱還不能是已經存在的微軟帳號,就發生一個悲劇就是

我的信箱已經註冊過微軟帳號,同一個ID也註冊過 outlook.com 了
很尷尬的情況,如果綁定其他信箱(也就是還得找一個沒註冊過微軟的)
會導致我的 ID 跟信箱不一樣了,雖然沒有直接影響,就是就是看上去有點雜

這個問題目前用 iphone app 登入不會強制你註冊新的微軟帳號,暫時先擱置著...



2025年5月3日 星期六

PowerShell 重試特定區塊腳本的函式

PowerShell 重試特定區塊腳本的函式


引用的函式

irm 'raw.githubusercontent.com/hunandy14/Invoke-Retry/main/Invoke-Retry.ps1'|iex


使用方法1

Invoke-Retry {
    Get-Content "non-existing-file.txt"
} -FinallyScriptBlock {
    Write-Host "  🔄 Running Cleanup"
} -MaxRetries 3 -DelaySeconds 1 -ErrorAction Stop

這是一個簡單的試錯,自動重試3次,每次1秒,然後最後面的 ErrorAction Stop 建議是設定一下避免出現預期之外的事情,內建很多函式只報錯並不會被 try 擷取到。


使用方法2

Invoke-Retry {
    Get-Content "non-existing-file.txt"
} -FinallyScriptBlock {
    Write-Host "  🔄 Running Cleanup"
} -RetryableErrors @(
    [System.Management.Automation.ItemNotFoundException],
    [System.IO.FileNotFoundException],
    [System.IO.DirectoryNotFoundException]
) -MaxRetries 3 -DelaySeconds 1 -ErrorAction Stop

可以通過 RetryableErrors 指定特定錯誤才重試


2025年2月4日 星期二

PowerShell 使用 ssh 驗證本地與遠端檔案的 SHA256 是否一致

PowerShell 使用 ssh 驗證本地與遠端檔案的 SHA256 是否一致

要驗證傳輸到底有沒有傳對用的函式

# 獲取遠端檔案的雜湊值
function Get-RemoteFileHash {
    [CmdletBinding()]
    param ( 
        # 遠端檔案路徑
        [Parameter(Mandatory, ValueFromPipeline)]
        [string]$Path,
        # 遠端登入資訊
        [Parameter(Mandatory)]
        [string]$RemoteLoginInfo,
        # 遠端私鑰
        [Parameter(Mandatory)]
        [string]$IdentityFile,
        # 遠端作業系統
        [Parameter(Mandatory)]
        [ValidateSet('Windows', 'Linux')]
        [string]$RemoteOS
    ) begin {
        # 檢查私鑰是否存在
        if (-not (Test-Path $IdentityFile)) {
            Write-Error "Cannot find path '$IdentityFile' because it does not exist."
        }
        # 定義不同作業系統的雜湊命令
        $hashCommands = @{
            'Windows' = "powershell `"(Get-FileHash -Path ([WildcardPattern]::Escape('$Path')) -Algorithm SHA256 -EA 1).Hash`""
            'Linux'   = "sha256sum '$Path' 2>&1 >/dev/null && sha256sum '$Path' | cut -d' ' -f1 | tr '[:lower:]' '[:upper:]'"
        }
        # SSH 連線參數設定
        $sshParams = @(
            '-oBatchMode=yes'
            "-oIdentityFile=$IdentityFile"
            $RemoteLoginInfo
        )
    } process {
        # 執行遠端雜湊命令
        $hash = & ssh @sshParams $hashCommands[$RemoteOS] 2>&1
        # 檢查 ssh 命令是否成功
        if ($LASTEXITCODE -ne 0) {
            Write-Error "ssh command failed: $hash" 
            return $null
        }
        # 檢查雜湊值格式是否正確 (SHA-256 應為 64 個十六進制字符)
        if (-not ($hash -match '^[A-F0-9]{64}$')) {
            Write-Error "The hash value '$hash' returned from command '$hashCommand' is not a valid SHA-256 format"
            return $null
        }
        return $hash
    }
}


使用範例

Get-RemoteFileHash "/home/chg/work/Tester.bats" `
    -RemoteLoginInfo "chg@192.168.3.53" `
    -IdentityFile "${env:USERPROFILE}\.ssh\id_ed25519" `
    -RemoteOS "Linux"

執行完會自動返回遠端檔案的哈希值,再來比較本地端即可知道是否一致了。




如果是要從 sftp 指令獲取位址可以參考這個

# 解析 SFTP 命令
function ParseSftpCommandPath {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline)]
        [string]$CommandText
    )
    process {
        # 跳過空行和註解
        if (-not ($CommandText -match '\S') -or $CommandText -match '^\s*#') { return }
        # 解析命令行
        $tokens = [regex]::Matches(
            $CommandText.Trim(), '"[^"]+"|[^\s"]+'
        ).Value.Trim('"')
        # 獲取遠端檔案路徑
        if ($tokens[0] -in 'get','put') {
            $paths = $tokens[1..($tokens.Count-1)].Where({ $_ -notmatch '^-' })
            $idx = @{
                'get' = @{local=-1; remote=0}
                'put' = @{local=0; remote=-1}
            }[$tokens[0]]
            [PSCustomObject]@{
                Command = $tokens[0]
                LocalPath = $paths[$idx.local]
                RemotePath = $paths[$idx.remote]
            }
        }
    }
} # "get /home/chg/work/Tester.bats Tester.bats" | ParseSftpCommandPath


2025-02-04 PowerShell 修改檔案日期與時間 (3)

PowerShell 修改檔案日期與時間 (3)

tags: 部落格文章


關於檔案的 修改時間 和 存取時間有什麼差別可以看這篇站內文


字串格式和日期格式怎麼互轉可以參考這一邊



修改檔案日期

代碼開源在這裡: hunandy14/FileDateEditor


快速使用

irm bit.ly/4gkzM5D|iex; Set-FileDate -File "test\file.txt" "2025-2-4"


詳細功能

# 載入函式
irm bit.ly/4gkzM5D|iex;

# 建立日期
Get-Item "test\file.txt" | Set-FileDate "2025-2-4" -Creation

# 修改日期
Get-Item "test\file.txt" | Set-FileDate "2025-2-4" -Write

# 存取日期
Get-Item "test\file.txt" | Set-FileDate "2025-2-4" -Access

# 日期字串
Get-Item "test\file.txt" | Set-FileDate "2025-02-04" -Format "yyyy-MM-dd"


生成測試檔案

irm bit.ly/4gkzM5D|iex; 1..10 | ForEach-Object{
  $idx=$_.ToString('00')
  New-Item -ItemType File -Path "file_2025-02-$idx.txt" |
  Set-FileDate "2025-02-$idx"
}




2025年1月10日 星期五

git 無更動檔案 合併當前到主分支

git 無更動檔案 合併當前到主分支

最大的分支雖然都是由PR合併的,但是開發的次要主線規模不大太大還是有可能會讓開發者自己管理的

在這種情況下每當做好功能之後會合併回去還得退回,檔案會經過一次大洗牌,這邊提供一個可以不更動檔案的方式合併到分支

為什麼會洗牌是因為git並不提交 merage to 他只有 merage from,就注定你只能切過去不然不要合

解法是還是得造一個工作區,但是不是當前的目錄,而次第二個工作樹,在次要的工作樹合併這件事情就解決了

大概需要底下幾個流程

# 進入主工作樹目錄
cd "Z:/my-project"

# 新增臨時工作樹,檢查出目標分支
git worktree add "Z:/my-project-dev" dev

# 在臨時工作樹中進行合併
cd "Z:/my-project-dev"
git merge fix

# 合併完成後,回到主工作樹刪除臨時工作樹
cd "Z:/my-project"
git worktree remove "Z:/my-project-dev"

對就是單純的在檢出一個工作樹就行了,不過做完記得要刪除因為那個工作樹是會佔用分支的,會導致你的主目錄切不過去。

2024年12月16日 星期一

SQLServer 搬移資料庫到D曹

SQLServer 搬移資料庫到D曹

要搬移的資料庫檔案在C裡面,比較快的方法是打下面的指令可以查出所有表儲存位置

USE master;
GO

SELECT 
    db_name(database_id) AS DatabaseName, 
    type_desc AS FileType, 
    physical_name AS FilePath
FROM sys.master_files
ORDER BY db_name(database_id), type_desc;

查出來之後先儲存下來等一下要一個一個手動掛回來會比較方便

再來需要停止 SQLSERVER 服務,停掉之後就可以直接開始搬檔案了

搬完之後由於服務啟動至少需要下面這三個東西,這個手動改一下
(或是不想改下圖這三個就不要搬,讓它保持在C曹搬你自己創建的就好)



這三個關鍵檔案改好就可以啟動了

啟動後會是一個全空的DB,用下面指令一個一個掛回來

下面的範例是把資料庫名稱 CHG 掛回來的指令
(把所有CHG改成你的資料庫名稱即可)

USE master;
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG', FILENAME = 'D:\MSSQL\DATA\CHG.mdf');
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG_log', FILENAME = 'D:\MSSQL\DATA\CHG_log.ldf');
GO
ALTER DATABASE CHG SET ONLINE;
GO


數量很多的話自己寫個腳本執行吧

下面是寫成動態 TSQL 的範例


-- 設置基礎路徑
DECLARE @BasePath NVARCHAR(255) = 'D:\MSSQL\DATA\';

-- 資料庫清單
DECLARE @DatabaseList TABLE (DatabaseName NVARCHAR(128));
INSERT INTO @DatabaseList VALUES 
('CHG1'),
('CHG2'),
('CHG3');

-- 定義變數
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @MdfPath NVARCHAR(255);
DECLARE @LdfPath NVARCHAR(255);
DECLARE @Sql NVARCHAR(MAX);

-- 確保基礎路徑結尾無斜線
IF RIGHT(@BasePath, 1) = '\'
    SET @BasePath = LEFT(@BasePath, LEN(@BasePath) - 1);

-- 開始遍歷資料庫清單
DECLARE db_cursor CURSOR FOR
SELECT DatabaseName FROM @DatabaseList;

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO @DatabaseName;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 生成 MDF 和 LDF 的路徑
    SET @MdfPath = @BasePath + '\' + @DatabaseName + '.mdf';
    SET @LdfPath = @BasePath + '\' + @DatabaseName + '_log.ldf';

    -- 修改 MDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + ''', FILENAME = ''' + @MdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 修改 LDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + '_log'', FILENAME = ''' + @LdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 將資料庫設為 ONLINE
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + ' SET ONLINE';
    EXEC sp_executesql @Sql;

    -- 繼續處理下一個資料庫
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
END;

-- 關閉並釋放資源
CLOSE db_cursor;
DEALLOCATE db_cursor;



2024年12月10日 星期二

gitk 圖形介面中的代碼比較亂碼

gitk 圖形介面中的代碼比較亂碼

裡面亂碼最後查到可以從 gitconfig 中設置,可以直接設置在全域也可以直接設置在專案資料夾,這邊如果你不確定怎麼做的話跟著底下教學儲存在專案設置就行。

為什麼會造成這個原因是,git 雖然是用 utf8 儲存,但是讀取的時候是根據電腦語言編碼解析的,也就是在中文 Windows 上預設會被使用 big-5 解碼。


解決方案

關鍵的設置指令是

[gui]
    encoding = utf-8

直接貼到專案資料夾中 .git\config 就可以起作用了


或是執行下面的指令 (消除 —local 會儲存到使用者全域設定)

git config --local gui.encoding utf-8


然後透過下面的指令查看

# Linux
git conig --local --list | grep gui.encoding

# pwsh
git config --local --list | Select-String "gui.encoding"

再重新打開 gitk 就可以正確的識別了