gpt4 book ai didi

c++ - 在 Windows 中删除文件时,CMD 和 PowerShell 有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:58 26 4
gpt4 key购买 nike

当我从 CMD 提示符运行命令行程序(它在内部删除日志文件)时,它按预期工作。

但是在 PowerShell 提示符下运行的相同命令不会删除日志文件。除了删除日志文件外,该命令已成功运行。 PowerShell 提示符没有引发任何错误或异常。

在文件处理方面,PowerShell 与 Windows 环境中的 CMD 提示符有何不同,在本例中它是删除文件?

注意:CMD 提示符和 PowerShell 都以管理员身份运行。

程序的源代码如下所示:

WIN32_FIND_DATA fd;
LPCWSTR search_path_wstr = ws.c_str();
HANDLE hFind = ::FindFirstFile(search_path_wstr, &fd);

wstring wsFilename(fd.cFileName);
string cFileName(wsFilename.begin(), wsFilename.end());
string absoluteFilename = strPath + "\\" + cFileName;
const char *filename = absoluteFilename.c_str();
remove(filename);

remove() 是删除文件的函数。

更新:我已经尝试将 remove() 更改为 DeleteFile(),行为仍然相同。

更新 2:我找到了根本原因。 PowerShell 返回绝对路径,而 CMD 提示符返回相对路径。这不是上述代码片段的一部分。

现在我需要确定路径是否是相对路径。有一个 Windows 函数,PathIsRelative(),但它需要 LPCWSTR 作为输入,并且需要再次进行一些转换。

最佳答案

我的超能力告诉我文件名中有非 ASCII 字符,失败案例中的错误是“找不到文件”。

在代码中,您将宽字符复制到常规 char 中。对于 ASCII 之外的任何内容,这都不会如您所愿。

您的代码示例未显示您如何获取源字符串或 strPath。

有可能,当您在 CMD 案例中输入搜索字符串时,它有一些可在当前代码页中表示的非 ASCII 字符,并且这些值被复制到宽字符然后返回而不会造成伤害,并且删除作品。

当您在 PowerShell 中输入它时,您可能会得到 UTF-16 编码的文本。当您将这些值复制回常规 char 时,您不会得到相同的字符串,因此删除可能会因“找不到文件”而失败。

不要这样做:

string cFileName(wsFilename.begin(), wsFilename.end());

一致地处理宽字符串,无需任何转换。如果必须在宽字符串和窄字符串之间进行转换,则必须知道编码并实际转码数据,而不仅仅是复制数据。

关于c++ - 在 Windows 中删除文件时,CMD 和 PowerShell 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50240515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com