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

What's the difference between CMD and PowerShell when deleting a file in Windows?

当我从 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字符,失败案例中的错误是"file not found."

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

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

有可能,当您在 CMD 案例中输入搜索字符串时,它有一些可在当前代码页中表示的非 ASCII 字符,并且这些值被复制到宽字符,然后又无害地复制回来,并且删除有效。

当您在 PowerShell 中输入它时,您可能会得到 UTF-16 编码的文本。当您将这些值复制回常规 chars 时,您不会得到相同的字符串,因此删除可能会因 "file not found."

而失败

不要这样做:

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

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