В чем разница между CMD и PowerShell при удалении файла в Windows? - PullRequest
0 голосов
/ 08 мая 2018

Когда я запускаю программу командной строки (которая внутренне удаляет файл журнала) из командной строки CMD, она работает как положено.

Но та же команда при запуске в командной строке PowerShell не удаляет файл журнала.Команда выполнена успешно, за исключением удаления файла журнала.В приглашении PowerShell нет ошибок или исключений.

Чем PowerShell отличается от приглашения CMD в среде Windows в отношении обработки файлов, в данном случае это удаление файла?

Примечание: как приглашение 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 в качестве входных данных и снова требуется некоторое преобразование.

1 Ответ

0 голосов
/ 09 мая 2018

Мои экстрасенсорные способности говорят мне, что имя файла содержит символы, не входящие в ASCII, и ошибка в случае сбоя - "файл не найден".

В коде вы копируете широкие символы в обычные char с. Для чего-либо за пределами ASCII это не будет делать то, что вы хотите.

Ваш пример кода не показывает, как вы получаете исходную строку или strPath.

Возможно, что когда вы вводите строку поиска в случае CMD, у нее есть не-ASCII-символы, которые могут быть представлены в текущей кодовой странице, и эти значения копируются в широкие символы, а затем обратно без вреда, и убрать работы.

Когда вы вводите его в PowerShell, вы, вероятно, получаете текст в кодировке UTF-16. Когда вы копируете эти значения обратно в обычные char s, вы не получаете ту же строку, поэтому удаление, вероятно, завершается неудачно с "file not found."

Не делай этого:

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

Работа с широкими строками последовательно, без каких-либо преобразований. Если вам нужно конвертировать между широкими и узкими строками, вы должны знать кодировку и фактически перекодировать данные, а не просто скопировать их.

...