use std::process::Command; use std::os::windows::process::CommandExt; const CREATE_NO_WINDOW: u32 = 0x08000000; // const DETACHED_PROCESS: u32 = 0x00000008; pub fn kill(name: &str) -> String { Command::new("taskkill") .args(&["/IM", name, "/F"]) .output() .unwrap(); format!("Killing {}", name) } pub fn run_steam() -> std::io::Result { Command::new("cmd") .args(&["/C", "start", "steam://run"]) .output() } // FIXME wmic is deprecated pub fn get_exe_path(name: &str) -> Result { let command = format!("/C wmic process where name='{}' get ExecutablePath", name); let args = command.split_whitespace().collect::>(); let output = Command::new("cmd.exe").args(&args).output()?; let out = String::from_utf8_lossy(&output.stdout).trim().to_string(); if out.contains("ExecutablePath") { let spt: Vec<&str> = out.split("\r\n").collect(); if spt.len() >= 2 { return Ok(spt[1].to_string()); } } Err(std::io::Error::new( std::io::ErrorKind::Other, "Failed to get executable path", )) } pub fn open_path(path: &str) -> Result<(), std::io::Error> { // path中所有/ 转换为 \ let path = path.replace("/", "\\"); Command::new("cmd.exe") .args(["/c", "start", "", &path]) .creation_flags(CREATE_NO_WINDOW) .spawn() .unwrap(); Ok(()) } mod tests { use super::*; #[test] fn test_open_path() { let path = "D:\\Programs\\Steam"; println!("test open path: {}", path); open_path(path).unwrap(); let path = "D:\\Programs\\Steam\\steamapps\\common\\Counter-Strike Global Offensive\\game\\bin\\win64"; println!("test open path: {}", path); open_path(path).unwrap(); let path = "%appdata%/Wmpvp/demo"; println!("test open path: {}", path); open_path(path).unwrap() } }