CreateTextFile с двоеточием в пути, ошибка не возвращается. Почему? - PullRequest
0 голосов
/ 16 февраля 2020

Это то, что я пытался (C: \ temp действительно существует):

$fso = New-Object -ComObject Scripting.FileSystemObject 
$ts = $fso.CreateTextFile("c:\temp:AAAAA.txt")      
$ts.Close() 

Ошибка не возвращается. Файл где-то создается (но не в c: \ temp ... если я помещу что-то внутрь, я смогу позже прочитать его), но я не могу его найти.

Может кто-нибудь объяснить мне, почему этот код не выдает ошибку & куда пропал файл?

1 Ответ

1 голос
/ 16 февраля 2020

Причина, по которой вы не получаете сообщение об ошибке, заключается в том, что вызов, вероятно, был успешным!

Когда вы вызываете CreateTextFile и передаете путь к файлу C:\temp:AAAAA.txt, вы фактически запрашиваете создание файла C:\temp с альтернативным потоком данных (ADS) с именем AAAAA.txt.

Вы можете убедиться сами с помощью Get-Item:

PS C:\> Get-Item C:\temp -Stream AAAAA.txt

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\temp:AAAAA.txt
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName   : temp:AAAAA.txt
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\temp
Stream        : AAAAA.txt
Length        : 0

Вы также можете читать и писать в альтернативные потоки данных (требуется PowerShell версии 5 или новее):

PS C:\> "Hello there!" |Set-Content C:\temp -Stream AAAAA.txt
PS C:\> Get-Content C:\temp -Stream AAAAA.txt
Hello there!

Обратите внимание, что эти потоки данных встроены c в NTFS и не сохранятся, если вы скопируете файл в файловую систему, отличную от NTFS, или, например, загрузите их на веб-сайт.

...