【问题标题】:Rust std::process with special charactersRust std::process 带有特殊字符
【发布时间】:2019-11-29 01:16:07
【问题描述】:

我有一个非常简单的 rust 程序,但它并没有达到我的预期。在 Windows 上运行,使用 powershell 提示符,我可以执行以下操作来显示 path

echo "%PATH%"

我有一个简单的 Rust 程序:

Command::new("echo")
    .arg("%PATH%")
    .spawn()
    .expect("ls command failed to start");

该命令将启动并运行,但会输出:

%PATH%

而不是路径内容,就像我期望的那样。其他不使用特殊字符的命令似乎按预期工作,所以我怀疑它与处理它们有关,但我没有看到在 Rust 中使命令比现在更原始的方法。

我尝试了各种格式,但它要么无法运行命令,要么运行相同。

我也尝试过使用 $env:path,但这总是无法从 Rust 运行并出现 cannot find the path specified 错误。

对处理这个有什么建议吗?我可以将内容写入文件并运行该文件,但是直接从其他语言运行这些类型的命令可以正常工作,所以我认为它也应该可以在 Rust 中运行。

谢谢!

更新:

通过以下方式设法获得预期结果:

let out = Command::new("cmd")
    .arg("/C")
    .arg("echo %PATH%")
    .spawn()
    .expect("ls command failed to start");
}

我认为这个问题的解释有点不同,因为获取路径只是我看到的一个更大问题的一个例子。用上面的更新也解决了我更大的问题。

【问题讨论】:

  • 我对Windows不太了解,但是在Linux上,这种简写是通过终端/shell扩展的。您必须使用另一个 crate 来读取环境变量。

标签: windows rust


【解决方案1】:

正如 French 的评论所说:生成进程不包括 Powershell 环境,它会在启动进程之前将 %PATH% 扩展为其实际内容。

您需要自己通过std::env 获取PATH 的内容,或者查找有关如何在powershell 会话中启动子进程的Powershell 文档。

【讨论】:

  • 谢谢!我可以通过将我的原件替换为:~~~ let out = Command::new("cmd") .arg("/C") .arg("echo %PATH%") .spawn( ) .expect("ls 命令启动失败"); ~~~ 我没有意识到它是在产生一个 CMD 提示而不是一个 powershell,但这不是原来的问题。
【解决方案2】:

正如其他人所提到的,这不是特殊字符,而是那些特殊字符在“echo”程序运行之前由 powershell 解释。

使用https://doc.rust-lang.org/cargo/reference/environment-variables.html 作为如何查找环境变量的参考,尝试如下操作:

use std::env;

fn main() {
    let cur_path = env::var("PATH").unwrap();
    println!("Environment is: {}", cur_path);
}

你可以在这里试试这个:https://play.rust-lang.org/

然后,如果您愿意,您可以将 cur_path 输入到您的“Command::new”中。诀窍是 powershell 在启动 echo 之前替换该参数,您可能不知道,而当您直接执行 echo 程序时,您必须自己进行替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2023-03-14
    • 2012-10-06
    • 2018-11-14
    • 2012-09-15
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多