在 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 编码的文本。当您将这些值复制回常规 char
s 时,您不会得到相同的字符串,因此删除可能会因 "file not found."
而失败
不要这样做:
string cFileName(wsFilename.begin(), wsFilename.end());
始终如一地处理宽字符串,无需任何转换。如果必须在宽字符串和窄字符串之间进行转换,则必须知道编码并实际转码数据,而不仅仅是复制它。
当我从 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 编码的文本。当您将这些值复制回常规 char
s 时,您不会得到相同的字符串,因此删除可能会因 "file not found."
不要这样做:
string cFileName(wsFilename.begin(), wsFilename.end());
始终如一地处理宽字符串,无需任何转换。如果必须在宽字符串和窄字符串之间进行转换,则必须知道编码并实际转码数据,而不仅仅是复制它。