From f35697f9ea8a0381191dba4f579ab64e88bf4fa2 Mon Sep 17 00:00:00 2001 From: Yueer <36443462+YueerMoe@users.noreply.github.com> Date: Mon, 9 Feb 2026 01:33:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(update):=20=E4=BF=AE=E5=A4=8D=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=84=9A=E6=9C=AC=E7=9A=84=E8=B7=AF=E5=BE=84=E5=BC=95?= =?UTF-8?q?=E5=8F=B7=E8=BD=AC=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/services/update.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/services/update.rs b/src-tauri/src/services/update.rs index 193146b..3c4c026 100644 --- a/src-tauri/src/services/update.rs +++ b/src-tauri/src/services/update.rs @@ -24,7 +24,11 @@ pub fn prepare_paths(exe_name: &std::ffi::OsStr) -> Result let new_exe = temp_dir.join(exe_name); let batch_path = temp_dir.join("updater.bat"); - Ok(UpdatePaths { temp_dir, new_exe, batch_path }) + Ok(UpdatePaths { + temp_dir, + new_exe, + batch_path, + }) } pub async fn download_new_exe( @@ -101,7 +105,7 @@ echo 启动新版本... start "" /min "{current_exe}" echo 清理临时文件... -start "" /min cmd /c "timeout /t 3 /nobreak >nul & if exist \"{temp_dir}\" rd /s /q \"{temp_dir}\"" +start "" /min cmd /c "timeout /t 3 /nobreak >nul & if exist ""{temp_dir}"" rd /s /q ""{temp_dir}""" exit /b 0 "#, @@ -113,3 +117,24 @@ exit /b 0 batch_content.replace('\n', "\r\n") } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn build_updater_batch_uses_cmd_double_quotes_for_cleanup() { + let content = build_updater_batch( + "endfield-cat.exe", + Path::new("C:\\Temp\\endfield-cat-update\\new.exe"), + Path::new("C:\\Program Files\\EndCat\\endfield-cat.exe"), + Path::new("C:\\Temp\\endfield-cat-update"), + ); + + // In cmd.exe, `\"` is not an escape; it can break parsing and lead to paths like `\\`. + assert!(!content.contains("\\\"")); + assert!(content.contains( + r#"if exist ""C:\Temp\endfield-cat-update"" rd /s /q ""C:\Temp\endfield-cat-update""""# + )); + } +} From 365d198deee319287a670777d0b804106a8e2876 Mon Sep 17 00:00:00 2001 From: Yueer <36443462+YueerMoe@users.noreply.github.com> Date: Mon, 9 Feb 2026 02:10:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(update):=20=E4=BD=BF=E7=94=A8=20PowerSh?= =?UTF-8?q?ell=20=E6=B8=85=E7=90=86=E6=9B=B4=E6=96=B0=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/services/update.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/services/update.rs b/src-tauri/src/services/update.rs index 3c4c026..509596b 100644 --- a/src-tauri/src/services/update.rs +++ b/src-tauri/src/services/update.rs @@ -105,7 +105,7 @@ echo 启动新版本... start "" /min "{current_exe}" echo 清理临时文件... -start "" /min cmd /c "timeout /t 3 /nobreak >nul & if exist ""{temp_dir}"" rd /s /q ""{temp_dir}""" +start "" /min powershell -NoProfile -ExecutionPolicy Bypass -Command "param([string]$p) Start-Sleep -Seconds 3; if (Test-Path -LiteralPath $p) {{ Remove-Item -LiteralPath $p -Recurse -Force }}" "{temp_dir}" exit /b 0 "#, @@ -123,7 +123,7 @@ mod tests { use super::*; #[test] - fn build_updater_batch_uses_cmd_double_quotes_for_cleanup() { + fn build_updater_batch_uses_powershell_literalpath_cleanup() { let content = build_updater_batch( "endfield-cat.exe", Path::new("C:\\Temp\\endfield-cat-update\\new.exe"), @@ -133,8 +133,19 @@ mod tests { // In cmd.exe, `\"` is not an escape; it can break parsing and lead to paths like `\\`. assert!(!content.contains("\\\"")); - assert!(content.contains( - r#"if exist ""C:\Temp\endfield-cat-update"" rd /s /q ""C:\Temp\endfield-cat-update""""# - )); + assert!(content.contains(r#"powershell -NoProfile -ExecutionPolicy Bypass -Command "param([string]$p) Start-Sleep -Seconds 3; if (Test-Path -LiteralPath $p) { Remove-Item -LiteralPath $p -Recurse -Force }""#)); + assert!(content.contains(r#""C:\Temp\endfield-cat-update""#)); + } + + #[test] + fn build_updater_batch_cleanup_quotes_ampersand_path() { + let content = build_updater_batch( + "endfield-cat.exe", + Path::new("C:\\Temp\\endfield-cat-update\\new.exe"), + Path::new("C:\\Program Files\\EndCat\\endfield-cat.exe"), + Path::new("C:\\Temp\\A&B\\endfield-cat-update"), + ); + + assert!(content.contains(r#""C:\Temp\A&B\endfield-cat-update""#)); } }