Создает ли PowerShell побочный эффект, который создает файл с числовым именем?

Мой ноутбук вчера вернулся из ремонта. Его жесткий диск был заменен на твердотельный накопитель со свежей установкой Windows 10 Домашняя для одного языка (обновление 1903) без резервного копирования. Он также поставлялся с учетной записью администратора, которая называлась что-то вроде «пользователь». Эта деталь смущала.

Я должен был лучше подготовить исследовательский кулак, но я был слишком нетерпелив. Итак, моей первой попыткой было изменить имя пользователя в Панели управления. Но имя пользовательской папки осталось прежним. Затем я выполнил Control UserPasswords2 и изменил там имя пользователя. Запустив его во второй раз, я не увидел ни одного пользователя в списке, но мне просто пришлось перезагрузиться. Я не помню, какое имя пользователя было там раньше, но к тому времени отображалось новое. Но, опять же, имя папки не изменилось.

Я заметил еще одну странную вещь: мой Wi-Fi дублировался. Я мог бы использовать, скажем, «NET» и «NET 2». Это было решено путем удаления обеих сетей. На всякий случай проверил, дублируется ли папка Temp, и нет.

Затем я провел более длительное исследование, и во многих местах указывалось решение, которое требовало изменения всех совпадающих значений пути пользователя в реестре, около 100 записей. Использование сценария PowerShell выглядело хорошей идеей. Я не нашел никакого кода для этого, но я уже играл с PowerShell. Пробуем простые вещи.

Я думал, что придерживаться Get- команд и избегать Set- будет безопасно. Но когда я выполнил следующее:

PS C:\Windows\system32> 1, 2, 3 | Get-ItemProperty

Результат был:

    Diretório: C:\Windows\system32


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       14/07/2019     11:21              8 1
-a----       14/07/2019     11:10              2 2
Get-ItemProperty : Não é possível localizar o caminho 'C:\Windows\system32\3' porque ele não existe.
No linha:1 caractere:11
+ 1, 2, 3 | Get-ItemProperty
+           ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Windows\system32\3:String) [Get-ItemProperty], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

Мне это показалось странным, потому что была таблица с информацией, смешанной с сообщением об ошибке, как будто она что-то изменила.

Я посмотрел папку System32 и там было два файла без расширения с именами 1 и 2. Это единственные файлы, созданные и измененные сегодня в этой папке. А 1 старше 2.

Вот что внутри 1:

3

Файл 2 пуст.

Файлы остаются там даже при закрытии PowerShell.

Вот история команд, которые я выполнил в последней (и, кажется, единственной) сессии:

PS C:\Windows\system32> help GetItemProperty 

PS C:\Windows\system32> GetChildItem -path HKCU:\ | GetItemProperty

PS C:\Windows\system32> Get-ChildItem -path HKCU:\ | Get-ItemProperty

PS C:\Windows\system32> Get-ChildItem -path HKCU:\

PS C:\Windows\system32> Get-ChildItem -path HKCU:\ | Get-ItemProperty Name

PS C:\Windows\system32> Get-ChildItem -path HKCU:\ | Get-ItemProperty -Name

PS C:\Windows\system32> Get-ChildItem -path HKCU:\ | Get-ItemProperty -Property "Name"

PS C:\Windows\system32> Get-ChildItem -path HKCU:\ | Get-ItemProperty

PS C:\Windows\system32> Get-ChildItem -path HKCU:\

PS C:\Windows\system32> 1,2,3 | Get-ItemProperty

PS C:\Windows\system32> 1, 2, 3 | Where $_ > 2

PS C:\Windows\system32> 1, 2, 3 | Where ($_ > 2)

PS C:\Windows\system32> 1, 2, 3 | Where $PSItem > 2

PS C:\Windows\system32> 1, 2, 3 | Where $_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where -($_ > 2)

PS C:\Windows\system32> 1, 2, 3 | Where-Object $_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where-Object -$_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ = 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ == 2

PS C:\Windows\system32> 1, 2, 3 | Where - $_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ -eq 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ -greater 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ -gt 2

PS C:\Windows\system32> 1, 2, 3 | Where -$_ -gt 0

PS C:\Windows\system32> 1, 2, 3 | Where -gt 0

PS C:\Windows\system32> 1, 2, 3 | Where-Object -$ -gt 1

PS C:\Windows\system32> 1, 2, 3 | Where-Object -$_ -gt 1

PS C:\Windows\system32> 1, 2, 3 | Where-Object -gt 1

PS C:\Windows\system32> 1, 2, 3 | Where -Property $_ Value 2

PS C:\Windows\system32> help Where

PS C:\Windows\system32> 1, 2, 3 | Where { $_ > 1 }

PS C:\Windows\system32> 1, 2, 3 | % { $_ > 1 }

PS C:\Windows\system32> 1, 2, 3 | % { $_ > 1 } | Write

PS C:\Windows\system32> 1, 2, 3 | % { $_ > 1 } | Write-Verbose

PS C:\Windows\system32> 1, 2, 3 | Where { $_ -eq 1 }

PS C:\Windows\system32> 1, 2, 3 | Where { $_ -gt 1 }

PS C:\Windows\system32> 1, 2, 3 | % { $_ -gt 1 }

PS C:\Windows\system32> 1, 2, 3 | % { if ($_ -gt 1) { Write $_ } }

PS C:\Windows\system32> help Write

PS C:\Windows\system32> 1, 2, 3 | Get-ItemProperty

Я не планирую менять реестр, я думаю, что просто вернуть старое имя и создать отдельную учетную запись будет нормально. Но стоит ли мне беспокоиться об этих двух файлах?

Простите за длинный пост. Заранее спасибо.


person AVP2019    schedule 14.07.2019    source источник


Ответы (1)


Каждый раз, когда вы делаете «> 1», вы создаете файл с именем «1». Или «> 2» для «2». Это (почти) то же самое, что и | out-file 1. Больше, чем в powershell, «-gt». Вы, кажется, поняли это позже.

echo hi > 1  # makes a file, encoded in unicode
echo hi > 2  # can also overwrite a file
echo hi >> 1  # append a file, but can mix encodings
echo hi >> 2

Да, они создают файл с именем «1» даже с завершающей ошибкой.

1 | where $_ > 1
1 | where ($_ > 1) 
1 | where -($_ > 1)
1 | where $psitem > 1
person js2010    schedule 14.07.2019
comment
Спасибо, мне было интересно, почему я должен использовать -eq вместо обычного оператора. Я видел похожую проблему на форуме Linux, моя ошибка была связана с неправильным синтаксисом. Но почему 2 создается первым? Я не могу найти правильную команду с › 2, поэтому она пуста? Первая допустимая команда с › использует 1, и я думаю, что 1 содержит 3, потому что файл записывается с нуля на каждой итерации. - person AVP2019; 15.07.2019
comment
Да, вы правы, но я не могу найти ни одного, который бы не выводил ошибку. Он пишет в файл независимо от этого? - person AVP2019; 15.07.2019
comment
Я не показывал результаты, потому что вопрос был уже длинным. - person AVP2019; 15.07.2019
comment
Это не ошибка. Ты просто занимаешься чем-то другим. - person js2010; 15.07.2019
comment
Powershell вроде как C. Очень выразителен, но можно прострелить себе ногу. Вы можете сделать подобное, если ошибка. if ($i = 1) { 'yes' } - person js2010; 15.07.2019
comment
Я попробовал это 1, 2, 3 | Where $_ > 10 в другом месте, и он выводит ошибку, но все равно создает файл с именем «10». Я предполагаю, что сообщение об ошибке не означает, что не было никаких действий. - person AVP2019; 15.07.2019
comment
Это всего лишь одна обратная цитата для кода. Ошибка заключается в отсутствии блока сценария с $_. 1 | where { $_ > 1 } - person js2010; 15.07.2019
comment
Я мог бы сделать это без ошибок. get-process | where handles > 1. Он ищет ненулевые дескрипторы, а затем сохраняет их в файл с именем 1. - person js2010; 15.07.2019
comment
Извините, что немного расширил рамки вопроса. Я пытаюсь сказать, что даже когда скриптового блока нет, PowerShell создает файл, но пустой, так как он ничего не может сделать с ошибкой. Но я думаю, что он должен выдать предупреждение об этом. - person AVP2019; 15.07.2019
comment
Ах да, предупреждения могли бы быть лучше во многих вещах. Будьте осторожны, чтобы не перезаписать файл с помощью › или элемента копирования. - person js2010; 15.07.2019
comment
Ты прав. Даже с завершающей ошибкой он делает файл. - person js2010; 15.07.2019
comment
Мне уже не нравится › в любом случае, потому что файл заканчивается в юникоде. Это просто заставляет меня больше не любить это. - person js2010; 15.07.2019
comment
Теперь я понимаю, что вы имеете в виду. Просто потому, что есть <, это не означает, что это вызовет ошибку. Но я имел в виду случай, когда это ошибка, но все же добиться действия. Я не уверен, как это объяснить, но похоже, что он анализирует и выполняет в «одно и то же» время, вместо того, чтобы сначала решить, действительно ли все это. - person AVP2019; 15.07.2019
comment
Я думаю, вы правильно объясняете. По крайней мере, вы не получите файл таким образом. 1, 2, 3 | Where $_ | out-file 10 › Странный случай. - person js2010; 15.07.2019
comment
Теперь буду осторожнее с PowerShell, чем вообще :) - person AVP2019; 15.07.2019
comment
Блог о подводных камнях powershell было бы неплохо проверить. - person js2010; 15.07.2019
comment
Да, хорошо обнаружить такие вещи в самом начале. - person AVP2019; 15.07.2019