powershell - передать - асинхронная передача переменной из javascript в php



Вывод(«echo») переменной в текстовый файл (3)

Я запускаю скрипт PowerShell для многих серверов, и он записывает выходные данные в текстовый файл.

Я хотел бы захватить сервер, на котором в данный момент работает скрипт. Пока у меня есть:

$file = "\\server\share\file.txt"
$computername = $env:computername

$computername | Add-Content -Path $file

Эта последняя строка добавляет вопросительные знаки в выходной файл. К сожалению.

Как передать переменную в текстовый файл в PowerShell?

https://ffff65535.com


В дополнение к полезному ответу на полезный ответ Bigtv с более краткими альтернативными и справочными данными:

# > $file is effectively the same as | Out-File $file
# Objects are written the same way they display in the console.
# Default character encoding is UTF-16LE (mostly 2 bytes per char.), with BOM.
# Use Out-File -Encoding <name> to change the encoding.
$env:computername > $file

# Set-Content calls .ToString() on each object to output.
# Default character encoding is "ANSI" (culture-specific, single-byte).
# Use Set-Content -Encoding <name> to change the encoding.
# Use Set-Content rather than Add-Content; the latter is for *appending* to a file.
$env:computername | Set-Content $file 

При выводе в текстовый файл у вас есть 2 фундаментальных варианта, которые используют разные представления объектов и используют разные кодировки по умолчанию :

  • Out-File (или > ) / Out-File -Append (или >> ):

    • Подходит для выходных объектов любого типа , так как форматирование вывода PowerShell по умолчанию применяется к выходным объектам.

      • Другими словами: вы получаете тот же результат, что и при печати на консоли .
    • Кодировка по умолчанию , которую можно изменить с -Encoding параметра -Encoding , - это Unicode , который является UTF-16LE в котором большинство символов кодируются как 2 байта . Преимущество кодировки Unicode, такого как UTF-16LE, заключается в том, что это глобальный алфавит, способный кодировать все символы со всех человеческих языков.

      • В PSv5.1 + вы можете изменить кодировку, используемую в > и >> , с помощью переменной $PSDefaultParameterValues , используя тот факт, что > и >> теперь фактически являются псевдонимами Out-File и Out-File -Append . Например, для перехода на UTF-8 используйте:
        $PSDefaultParameterValues['Out-File:Encoding']='UTF8'
  • Set-Content / Add-Content :

    • Для записи строк и экземпляров типов, которые, как известно, имеют значимые представления строк , такие как базовые типы данных .NET (Booleans, integers, ...).

      • .psobject.ToString() вызывается для каждого выходного объекта , что приводит к бессмысленным представлениям для типов, которые явно не реализуют значимое представление; [hashtable] являются примером:
        @{ one = 1 } | Set-Content t.txt @{ one = 1 } | Set-Content t.txt записывает литерал System.Collections.Hashtable в t.txt , который является результатом @{ one = 1 }.ToString() .
    • Кодировка по умолчанию , которая может быть изменена с -Encoding параметра -Encoding , - это значение по Default , которое является кодовой страницей системы ANSI , однобайтной кодировкой для конкретной культуры для приложений, отличных от Юникода, чаще всего с Windows-1252 .
      Обратите внимание, что в documentation настоящее время неправильно указано, что ASCII является кодировкой по умолчанию.

    • Обратите внимание, что целью Add-Content является добавление содержимого в существующий файл , и это эквивалентно Set-Content если целевой файл еще не существует.
      Кроме того, по умолчанию или указанная кодировка слепо применяется , независимо от кодирования существующего содержимого файла.

Out-File / > / Set-Content / Add-Content все действуют на культуру - чутко , т. Е. Создают представления, подходящие для текущей культуры (локали), если они доступны (хотя пользовательские данные форматирования могут свободно определять свои собственные, культурно-инвариантные представление - см. Get-Help about_format.ps1xml ). Это контрастирует с расширением строки PowerShell (строчная интерполяция в строках с двойными кавычками), которая является культурно- инвариантной - см. Этот мой ответ .

Что касается производительности : поскольку Set-Content не требует применения форматирования по умолчанию для ввода, он работает лучше.

Что касается симптома ОП с Add-Content :

Поскольку $env:COMPUTERNAME не может содержать символы, отличные от ASCII, вывод Add-Content с использованием кодировки ANSI не должен приводить к ? символы на выходе, и наиболее вероятным объяснением является то, что ? были частью существующего содержимого в файле выходного файла $file , к которому Add-Content .


Ваш пример кода выглядит нормально. Таким образом, корневую проблему нужно как-то откопать. Давайте устраним вероятность появления опечаток в скрипте. Прежде всего, убедитесь, что вы установили Set-Strictmode -Version 2.0 в начало вашего скрипта. Это поможет вам распознать имена переменных с ошибками. Вот так,

# Test.ps1
set-strictmode -version 2.0 # Comment this line and no error will be reported.
$foo = "bar"
set-content -path ./test.txt -value $fo # Error! Should be "$foo"

PS C:\temp> .\test.ps1
The variable '$fo' cannot be retrieved because it has not been set.
At C:\temp\test.ps1:3 char:40
+ set-content -path ./test.txt -value $fo <<<<
    + CategoryInfo          : InvalidOperation: (fo:Token) [], RuntimeException
    + FullyQualifiedErrorId : VariableIsUndefined

Следующая часть о вопросительных знаках звучит так, как будто у вас проблема с Unicode. Каков результат, когда вы вводите файл с помощью Powershell,

$file = "\\server\share\file.txt"
cat $file

Самый простой пример Hello World ...

$hello = "Hello World"
$hello | Out-File c:\debug.txt




file-io