Справочная информация — Клёвый код https://coolcode.ru Скриптописание и кодинг Thu, 05 Oct 2017 04:07:41 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.8.12 https://coolcode.ru/wp-content/uploads/2015/10/YO1-150x150.png Справочная информация — Клёвый код https://coolcode.ru 32 32 PowerShell. Решение проблем связынных с удалённым подключением (about_Remote_Troubleshooting) https://coolcode.ru/powershell-reshenie-problem-svyazyinnyih-s-udalyonnyim-podklyucheniem-about_remote_troubleshooting/ https://coolcode.ru/powershell-reshenie-problem-svyazyinnyih-s-udalyonnyim-podklyucheniem-about_remote_troubleshooting/#respond Tue, 29 Dec 2015 09:53:26 +0000 http://coolcode.ru/?p=5322

В этом разделе описываются некоторые из проблем, которые могут возникнуть при использовании функций удалённого взаимодействия Windows PowerShell, основанные на технологии WS-Management, и предлагаются решения этих проблем.

Перед использованием удалённого взаимодействия Windows PowerShell , рекомендуется ознакомиться с about_Remote и about_Remote_Requirements для изучения руководств по конфигурации и базовом использовании удалённого взаимодействия. Кроме того, справки по каждому из командлетов удаленного взаимодействия, в частности описание параметров, имеют полезную информацию, которая предназначена, чтобы помочь вам избежать проблем.

Обновленные версии этой темы, и другие справки Windows PowerShell, могут быть скачаны с помощью командлета Update-Help.

ПРИМЕЧАНИЕ: Чтобы просмотреть или изменить настройки для локального компьютера на диске WSMan: , в том числе изменить конфигурацию сессий, доверенных хостов, портов или слушателей, запустите Windows PowerShell с параметром «Запуск от имени администратора».

 

Решение вопросов, связанных с правами доступа и аутентификации

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

 

 Как запустить от имени администратора

ОШИБКА: Отказано в доступе. Вам необходимо запустить этот командлет с повышенными правами.
ERROR: Access is denied. You need to run this cmdlet from an elevated process.

Чтобы запустить сессию удаленного взаимодействия на локальном компьютере, или просмотреть и изменить настройки локального компьютера на диске WSMan:, в том числе изменить конфигурацию сессий, доверенных хостов, портов или слушателей, необходимо запустить Windows PowerShell командой «Запуск от имени администратора».

Чтобы запустить Windows PowerShell командой «Запуск от имени администратора»:
— Щелкните правой кнопкой мыши по значку Windows PowerShell (или Windows PowerShell ISE) и нажмите «Запуск от имени администратора».

Чтобы запустить Windows PowerShell командой «Запуск от имени администратора» в Windows 7 и Windows Server 2008 R2.
— На панели задач Windows, щелкните правой кнопкой мыши значок Windows PowerShell, а затем нажмите кнопку «Запуск от имени администратора».

Примечание: По умолчанию, в Windows Server 2008 R2, значок Windows PowerShell закреплен на панели задач .

 

Как включить удаленное взаимодействие

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED
или
ОШИБКА: В соединении с удаленным хостом было отказано. Убедитесь, что служба WS-Management запущена на удаленном хосте и настроена для прослушивания запросов на правильный порт и HTTP URL.
ERROR: The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL.

Для того, что бы компьютер отправлял удалённые команды не требуется ни каких настроек. Тем не менее, для получения удаленных команд, Windows PowerShell Remoting должен быть настроен на удалённом компьютере. Настройка включает в себя запуск службы WinRM, установка типа запуска для службы WinRM в Automatic режим, настройка прослушивания HTTP и HTTPS соединений, а также создание конфигураций сеансов по умолчанию.

По умолчанию, Windows PowerShell Remoting включен в Windows Server 2012 и более новых версиях серверных систем Windows. Чтобы включить удаленное взаимодействие, на всех других системах, необходимо запустить командлет Enable-PSRemoting. На Windows Server 2012 и более новых версиях Windows Server, можно так же повторно запустить командлет Enable-PSRemoting, это включит удаленное взаимодействие, если оно было отключено.

Чтобы настроить компьютер на получение удаленных команд, воспользуйтесь командлетом Enable-PSRemoting. Этот командлет настроит все необходимые параметры удаленного взаимодействия, настроит конфигурацию сессий и перезапустит службы WinRM, чтобы изменения вступили в силу.

Enable-PSRemoting

Для подавления всех пользовательских подсказок укажите парметр -Force:

Enable-PSRemoting -Force

Для получения дополнительной информации см Enable-PSRemoting.

 

Как включить удаленное взаимодействие на предприятии

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED
или
ОШИБКА: В соединении с удаленным хостом было отказано. Убедитесь, что служба WS-Management запущена на удаленном хосте и настроена для прослушивания запросов на правильный порт и HTTP URL.
ERROR: The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL.

Для настройки одного компьютера на приёма соединений и выполнения на нём удалённых команд в Windows PowerShell, используется командлет Enable-PSRemoting.

Чтобы включить удаленное взаимодействие на нескольких компьютерах в предприятии, можно воспользоваться следующим вариантом.
— Чтобы настроить слушателей на удаленное взаимодействие, надо включить параметр «Allow automatic configuration of listeners» в групповой политике. Для получения инструкций см «Как включить слушателей с помощью групповой политики» (раздел ниже).
— Чтобы на нескольких компьютерах изменить тип запуска Windows Remote Management (WinRM) на Automatic, используется командлет Set-Service. Для получения инструкций см «Как изменить тип запуска, в службе WinRM» (раздел ниже).
— Чтобы настроить исключение брандмауэра, надо воспользоваться групповой политикой «Windows Firewall: Allow Local Port Exceptions». Для получения инструкций см «Как создать исключение в брандмауэре, с помощью групповой политики» (раздел ниже).

 

Как включить слушателей с помощью групповой политики

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED
или
ОШИБКА: В соединении с удаленным хостом было отказано. Убедитесь, что служба WS-Management запущена на удаленном хосте и настроена для прослушивания запросов на правильный порт и HTTP URL.
ERROR: The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL.

Чтобы настроить слушателей на всех компьютерах в домене, надо включить политику «Allow automatic configuration of listeners» находящуюся по следующему пути дерева групповых политик:

Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM service

Включите политику и укажите IPv4 и IPv6 фильтры. Можно воспользоваться шаблонами (*).

 

Как включить удаленное взаимодействие в сетях общего пользования

ОШИБКА: Не удалось проверить состояние брандмауэра
ERROR: Unable to check the status of the firewall

Командлет Enable-PSRemoting возвращает эту ошибку, когда локальная сеть является публичной, но параметр SkipNetworkProfileCheck не использовался в команде.

На серверных версиях Windows, командлет Enable-PSRemoting успешно выполняется во всех типах сетевого расположения. Он создает правила брандмауэра, разрешающие удаленный доступ к частной и доменой («Home» и «Work») сети. Для общественных сетей, он создает правила брандмауэра, которые разрешают удаленный доступ из той же локальной подсети.

На клиентских версий Windows, командлет Enable-PSRemoting успешно выполняется в частных и доменных сетях. По умолчанию, он не работает на общественных сетях, но если вы используете параметр SkipNetworkProfileCheck, командлет Enable-PSRemoting успешно создает правила брандмауэра, что разрешает трафик из той же локальной подсети.

Чтобы избавиться от ограничения локальной подсетью в сетях общего пользования и разрешить удаленный доступ из любого места сети, надо выполнить следующую команду:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

Командлет Set-NetFirewallRule содержится в модуле NetSecurity.

ПРИМЕЧАНИЕ: В Windows PowerShell 2.0, на компьютерах под управлением серверных версий Windows, командлет Enable-PSRemoting создает правила брандмауэра, разрешающие удаленный доступ из частных, доменых и общественных сетях. На компьютерах, работающих под управлением клиентских версий Windows, командлет Enable-PSRemoting создаёт правила брандмауэра, разрешающие удаленный доступ только из частных и доменных сетей.

 

Как настроить исключение брандмауэра с помощью групповой политики

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED
или
ОШИБКА: В соединении с удаленным хостом было отказано. Убедитесь, что служба WS-Management запущена на удаленном хосте и настроена для прослушивания запросов на правильный порт и HTTP URL.
ERROR: The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL.

Чтобы настроить исключение брандмауэра для всех компьютеров в домене, надо настроить политику «Windows Firewall: Allow local port exceptions» по следующему пути в дереве групповых политик:

Computer Configuration\Administrative Templates\Network\Network Connections\Windows Firewall\Domain Profile

Эта политика позволяет членам группы Administrators на компьютере, использовать Windows Firewall в панели управления, чтобы создать исключение в брандмауэре, для службы удаленного управления Windows.

 

Как установить тип запуска службы WinRM

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED

Windows PowerShell Remoting зависит от службы удаленного управления Windows (WinRM). Для поддержки удаленных команд служба должна быть запущена .

На серверных версиях Windows, тип запуска службы удаленного управления Windows (WinRM) автоматический.

Тем не менее, на клиентских версиях Windows, служба WinRM по умолчанию отключена.

Чтобы установить тип запуска службы на удаленном компьютере, можно воспользоваться командлетом Set-Service.

Для запуска команды на нескольких компьютерах, можно создать текстовый или CSV файл с именами компьютеров.

Например, следующие команды получают список имен компьютеров из файла Servers.txt, а затем у всех компьютеров устанавливают тип запуска службы WinRM на автоматический.

C:\PS> $servers = Get-Content servers.txt
C:\PS> Set-Service WinRM -ComputerName $servers -startuptype Automatic

Увидеть результаты можно с помощью командлета Get-WmiObject получив данные из объекта Win32_Service. Для получения дополнительной информации см Set-Service.

 

Как настроить конфигурацию сессий по умолчанию

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED

Для подключения к локальному компьютеру и выполнения команд удаленно, локальный компьютер должен содержать конфигурацию сессий для удаленных команд.

По умолчанию, при использовании командлета Enable-PSRemoting, создаётся конфигурация сессий  на локальном компьютере. Удаленные пользователи используют эту конфигурацию сессий каждый раз, когда удалённая команда не использует параметр ConfigurationName.

Если конфигурация по умолчанию на компьютере не зарегистрирована или удалена, можно воспользоваться командлетом Enable-PSRemoting для её восстановления. Вы можете использовать эту команду несколько раз. Это не приведёт к возникновению ошибок, если функция уже настроена.

Если вы изменили конфигураций сессий по умолчанию и хотите восстановить исходные настройки конфигурации сессий по умолчанию. Надо воспользоваться командлетом Unregister-PSSessionConfiguration, для удаления изменённой конфигурации сесий. А затем использвать командлет Enable-PSRemoting, что бы восстановить настройки по умолчанию. командлет Enable-PSRemoting не изменяет существующую конфигурацию сессий.

Примечание: Командлет Enable-PSRemoting восстанавливая конфигурацию сеанса по умолчанию, он не создает явные дескрипторы безопасности для конфигураций. Вместо этого, конфигурация наследуют дескриптор безопасности RootSDDL, который является дескриптором безопасной по умолчанию.

Чтобы увидеть дескриптор безопасности RootSDDL, выполните:

Get-Item wsman:\localhost\Service\RootSDDL

Чтобы изменить RootSDDL, используются командлеты Set-Item на диске WSMan:. Чтобы изменить дескриптор безопасности конфигурации сеанса, используйется командлет Set-PSSessionConfiguration с параметром SecurityDescriptorSDDL или ShowSecurityDescriptorUI.
Для получения более подробной информации о диске WSMan:, можно посмотреть раздел справки для поставщика WS-Management («Get-Help WSMan»).

 

Как обеспечить администратора необходимыми полномочиями

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED

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

Если текущий пользователь является членом группы администраторов на удаленном компьютере, или может предоставить учетные данные члена группы администраторов, для удаленного подключения нужно передать учётные данные администратора с помощью параметра Credential в командлетах New-PSSession, Enter-PSSession или Invoke-Command.

Например, следующая команда предоставляет учетные данные администратора.

Invoke-Command -ComputerName Server01 -Credential Domain01\Admin01

Для получения более подробной информации о параметре Credential, можно посмотреть справку к командлетам New-PSSession, Enter-PSSession или Invoke-Command.

 

Как включить удаленное взаимодействие для пользователей не являющимися администраторами

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED

Чтобы установить PSSession или выполнить команду на удаленном компьютере, текущий пользователь должен иметь разрешение на использование конфигураций сеансов на удаленном компьютере.

По умолчанию, только члены группы администраторов на текущем компьютере имеют разрешение на использование конфигураций сеансов по умолчанию. Таким образом, только члены группы Администраторы могут подключаться к компьютеру удаленно.

Чтобы разрешить другим пользователям подключаться к локальному компьютеру, необходимо выдать пользователю разрешения на выполнение конфигураций сеансов по умолчанию на локальном компьютере.

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

Set-PSSessionConfiguration Microsoft.PowerShell -ShowSecurityDescriptorUI

Для получения дополнительной информации см about_Session_Configurations.

 

Как включить удаленное взаимодействие для администраторов в других доменах

ОШИБКА: доступ запрещен
ERROR: ACCESS IS DENIED

Когда пользователь из другого домена являются членом группы администраторов на локальном компьютере, этот пользователь не может подключиться к локальной компьютеру удаленно с правами администратора. По умолчанию, удаленные подключения из других доменов запускаются с токенами прав стандартных пользователей.

Тем не менее, вы можете изменить поведение по умолчанию, используя запись реестра LocalAccountTokenFilterPolicy и запускать удаленные подключения пользователей которые являются членами группы администраторов с правами администратора.

Внимание: Ключ LocalAccountTokenFilterPolicy отключает контроль учетных записей (UAC) удаленных подключений для всех пользователей со всех компьютеров. Обдумайте последствия изменения этого параметра, прежде чем изменять политику.

Чтобы изменить политику, используйте следующую команду, чтобы установить значение параметра реестра LocalAccountTokenFilterPolicy на 1.

C:\PS> New-ItemProperty -Name LocalAccountTokenFilterPolicy -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -PropertyType DWord -Value 1

 

Как использовать IP адрес при запуске команды удаленно

ОШИБКА: Клиенту WinRM не удается обработать запрос. Если схема аутентификации отличается от Kerberos или, если клиентский компьютер не присоединен к домену, то необходимо использовать протокол HTTPS или на сервере должны быть добавлены установки  конфигурации TrustedHosts.

ERROR: The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting.

Параметр ComputerName командлетов New-PSSession, Enter-PSSession и Invoke-Command могут принимать IP-адрес в качестве значения. Тем не менее, поскольку проверка подлинности Kerberos не поддерживает IP-адреса, когда вы указываете IP адрес, по умолчанию используется аутентификация NTLM.

Для использования проверки подлинности NTLM, требуется следующая процедура для удаленного взаимодействия.

1. Настроить компьютер для протокола HTTPS или добавить IP-адрес удаленного компьютера в список TrustedHosts на локальном компьютере.

Для получения инструкций см «Как добавить компьютер в список TrustedHosts» ниже.

2. Необходимо использовать параметр Credential во всех удаленных командах. Это необходимо, даже если вы указываете параметры аутентификации текущего пользователя.

 

Как создать удалённое подключение к компьютеру находящемуся в рабочей группе

ОШИБКА: Клиенту WinRM не удается обработать запрос. Если схема аутентификации отличается от Kerberos или, если клиентский компьютер не присоединен к домену, то необходимо использовать протокол HTTPS или на сервере должны быть добавлены установки  конфигурации TrustedHosts.

ERROR: The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting.

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

1. Настроить компьютер для протокола HTTPS или добавить имена удаленных компьютеров в список TrustedHosts на локальном компьютере.

Для получения инструкций см «Как добавить компьютер в список TrustedHosts» ниже.

2. Убедитесь, что задан пароль на компьютере находящийся в рабочей группе. Если пароль не задан или пароль пустой, вы не сможете выполнить удаленные команды.

Чтобы установить пароль для учетной записи пользователя, используйте «Учетные записи пользователей» в «Панели управления».

3. Используйте параметр Credential во всех удаленных командах.

Это необходимо, даже если вы отправляете параметры аутентификации текущего пользователя.

 

Как добавить компьютер в список доверенных хостов

Пункт TrustedHosts может содержать список имён компьютеров, IP-адреса и полные доменные имена разделенные запятыми. Шаблонные символы разрешены.

Чтобы просмотреть или изменить список доверенных узлов, можно воспользоваться диском WSMan:. Объект TrustedHost находится в дирректории WSMan:\localhost\Client.

Только члены группы администраторов данного компьютера имеют разрешения, на изменение списка доверенных хостов компьютера.

Внимание: Значение, которое устанавливается для элемента TrustedHosts влияет на всех пользователей компьютера.

Для просмотра списка доверенных хостов, можно воспользоваться следующей командой:

Get-Item wsman:\localhost\Client\TrustedHosts

Также можно использовать Set-Location (псевдоним cd), чтобы перейти в данную директорию на диске WSMan:. Например:

cd WSMan:\localhost\Client; dir

Чтобы добавить все компьютеры в список доверенных хостов, используйте следующую команду, которая ставит значение * (все) в ComputerName

Set-Item wsman:localhost\client\trustedhosts -Value *

Можно, также использовать шаблонный символ (*), чтобы добавить все компьютеры в конкретной области в список доверенных хостов. Например, следующая команда добавляет все компьютеры в домене Fabrikam в список доверенных хостов.

Set-Item wsman:localhost\client\trustedhosts *.fabrikam.com

Чтобы добавить имена конкретных компьютеров в список доверенных хостов, используйте следующий формат команды:

Set-Item wsman:\localhost\Client\TrustedHosts -Value < имя_компьютера> [, < имя_компьютера>]

,где каждое значение < имя_компьютера> должно иметь следующий формат:

< Компьютер>.< Домен>.< Компания>.< Домен верхнего уровня>

Например:

Set-Item wsman:\localhost\Client\TrustedHosts -Value Server01.Domain01.Fabrikam.com

Чтобы добавить имя компьютера в существующий список доверенных хостов, сначала надо сохранить текущее значение в переменную, а затем дополнить новыми значениями разделёнными запятыми образовав новый список,  который включает текущие и новые значения.

Например, чтобы добавить компьютер Server01 в в существующий список доверенных хостов, используйте следующую команду

$curValue = (Get-Item wsman:\localhost\Client\TrustedHosts).value

Set-Item wsman:\localhost\Client\TrustedHosts -Value "$curValue, Server01.Domain01.Fabrikam.com"

Чтобы добавить IP-адреса компьютеров в список доверенных хостов, используется следующий формат команды:

Set-Item wsman:\localhost\Client\TrustedHosts -Value <IP Address>

Например:

Set-Item wsman:\localhost\Client\TrustedHosts -Value 172.16.0.0

Чтобы добавить компьютер в список TrustedHosts удаленного компьютера, можно воспользоваться командлетом Connect-WSMan. Командлет  Connect-WSMan используется для добавления узла на диске WSMan: удаленного компьютера с локального компьютера. Затем используйте команду Set-Item, чтобы добавить компьютер.

Для получения более подробной информации о командлете Connect-WSMan командлета см справку Connect-WSMan.

 

Устранение неполадок конфигурации компьютера

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

 

Как настроить удаленное взаимодействие на переменных портах

ОШИБКА: В соединении с удаленным хостом было отказано. Убедитесь, что служба WS-Management запущена на удаленном хосте и настроена для прослушивания запросов на правильный порт и HTTP URL.
ERROR: The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL.

По умолчанию Windows PowerShell Remoting использует 80 порт для HTTP протокола. Порт по умолчанию используется, когда пользователь не указал параметры ConnectionURI или порт в удаленной команды.

Чтобы изменить порт по умолчанию, который использует Windows PowerShell, используйте командлет Set-Item на диске WSMan:, чтобы изменить значение порта для прослушки.

Например, следующая команда изменяет порт по умолчанию на 8080.

Set-Item wsman:\localhost\listener\listener*\port -Value 8080

 

Как настроить удаленное взаимодействие через прокси-сервер

ОШИБКА: клиент не может подключиться к месту назначения, указанного в запросе. Убедитесь, что служба в месте назначения работает и принимает запросы.

ERROR: The client cannot connect to the destination specified in the request. Verify that the service on the destination is running and is accepting requests.

Поскольку Windows PowerShell Remoting использует протокол HTTP, то он зависит от установок прокси на HTTP. На предприятиях, которые имеют прокси-серверы, пользователи не могут получить доступ к удаленному компьютеру Windows PowerShell напрямую.

Чтобы решить эту проблему, передайте настройки прокси-сервера при запуске удаленных команд.
Доступны следующие параметры:

— ProxyAccessType
— ProxyAuthentication
— ProxyCredential

Чтобы задать эти параметры для определенной команды, используйте следующую процедуру:

1. Используйте параметры ProxyAccessType, ProxyAuthentication и ProxyCredential с командлетом New-PSSessionOption, для создания объекта параметров сеанса с настройкми прокси-сервера  вашей сети. Сохраните объект в переменной.

2. Передайте переменную, которая содержит объект с парматрами вашего прокси сервера в  параметр SessionOption командлетов New-PSSession, Enter-PSSession, или Invoke-Command

Например, следующая команда создает объект с параметрами сеанса содержащий параметры прокси сервера, а затем используется этот объект, чтобы создать удаленный сеанс.

C:\PS> $SessionOption = New-PSSessionOption -ProxyAccessType IEConfig -ProxyAuthentication Negotiate -ProxyCredential Domain01\User01
C:\PS> New-PSSession -ConnectionURI https://www.fabrikam.com

Для получения более подробной информации о командлете New-PSSessionOption см справку по New-PSSessionOption.

Чтобы задать эти параметры для всех удаленных команд в текущем сеансе, присвойте значение объекта  полученного из командлета New-PSSessionOption переменной $PSSessionOption. Для получения более подробной информации о привилегированной переменной $PSSessionOption см about_Preference_Variables.

Чтобы задать эти параметры для всех удаленных команд всех сессий Windows PowerShell на локальном компьютере, надо добавить привилегированную переменную $PSSessionOption в свой профиль Windows PowerShell. Для получения более подробной информации о профилях Windows PowerShell см about_Profiles.

 

Как обнаружить 32-битную сессию на 64-разрядном компьютере

ОШИБКА: Элемент «<tool-Name>» не распознается, как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильность написания имени, или если был указан путь, убедитесь, что путь является правильным и попробуйте еще раз.

ERROR: The term «<tool-Name>» is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Если удаленный компьютер работает под управлением 64-разрядной версии Windows, а дистанционная команда использует 32-битную конфигурацию сеанса, такую как Microsoft.PowerShell32. Служба удаленного управление Windows (WinRM) загружает процесс WOW64 на Windows, а Windows автоматически перенаправляет все ссылки из каталога %WinDir%\System32, в каталог %WINDIR%\SysWOW64.

В результате, если вы пытаетесь использовать инструменты из каталога System32, которые не имеют аналогов в каталоге SysWow64, таких как Defrag.exe, инструменты не могут найтись в данном каталоге.

Чтобы найти архитектуру процессора, который используется в сессии, можно воспользоваться значением переменной PROCESSOR_ARCHITECTURE окружающей среды. Следующая команда находит архитектуру процессора сессии из переменной $s.

C:\PS> $s = New-PSSession -ComputerName Server01 -configurationName CustomShell

C:\PS> invoke-command -session $s {$env:PROCESSOR_ARCHITECTURE}
x86

Для получения более подробной информации о конфигурациях сеансов см about_session_configurations.

 

Поиск и устранение неисправностей политик и вопросы привилегий

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

 

Как изменить политику выполнения для командлетов Import-PSsession и Import-Module

ОШИБКА: Import-Module: Файл <имя файла> не может быть загружен, потому что выполнение скриптов отключено в этой системе.

ERROR: Import-Module: File <filename> cannot be loaded because the execution of scripts is disabled on this system.

Командлеты Import-PSSession и Export-PSSession создают модули, которые содержат не подписанные файлы скриптов и файлы форматирования.

Чтобы импортировать модули созданные этими командлетами, с помощью командлетов Import-PSSession или Import-Module, измените значение политики выполнения в текущем сеансе на Restricted или AllSigned. Дополнительные сведения о политиках выполнения Windows PowerShell можно посмотреть в about_Execution_Policies.

Чтобы импортировать модули без изменения политики выполнения для локального компьютера, который изменяет реестр, можно использовать параметр Scope командлета Set-ExecutionPolicy, что бы задать менее жёсткую политику выполнения для одного процесса.

Например, следующая команда запускает процесс с политикой выполнения RemoteSigned. Изменение политики выполнения распространяется только на текущий процесс и не изменяет параметры реестра Windows PowerShell ExecutionPolicy.

Set-ExecutionPolicy -Scope process -ExecutionPolicy RemoteSigned

Можно, также использовать параметр ExecutionPolicy при запуске PowerShell.exe, чтобы начать один сеанс с менее ограничительной политикой выполнения.

PowerShell.exe -ExecutionPolicy RemoteSigned

Для получения более подробной информации о командлетах см Import-PSSession, Export-PSSession и Import-Module. Для получения более подробной информации о политике выполнения, см about_Execution_Policies. Для получения более подробной информации о powershell.exe, выполните в консоли «PowerShell.exe -?».

 

Как устанавливать и изменять квоты

ОШИБКА: Общее кол-во данных, полученных от удаленного клиента превысили разрешенный максимум.

ERROR: The total data received from the remote client exceeded allowed maximum.

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

Следующие квоты доступны в базовой конфигурации.

— Поставщик WSMan (WSMan:) предоставляет несколько параметров квот, таких, как  настройки MaxEnvelopeSizeKB и MaxProviderRequests  в  узле WSMan:\<ComputerName> и настройки MaxConcurrentOperations, MaxConcurrentOperationsPerUser и MaxConnections  в узле WSMan:\<ComputerName>\Service,

— Вы можете защитить локальный компьютер с помощью параметров MaximumReceivedDataSizePerCommand и MaximumReceivedObjectSize командлета New-PSSessionOption и привилегированной переменной $PSSessionOption.

— Вы можете защитить удаленный компьютер, добавив ограничения на конфигурацию сеанса, используя параметры MaximumReceivedDataSizePerCommandMB и MaximumReceivedObjectSizeMB командлета Register-PSSessionConfiguration.

Когда квоты конфликтуют с командой, Windows PowerShell создаёт ошибку.

Для устранения этой ошибки, надо изменить удаленную команду для удовлетворения квоты. Или определить источник квоты, а затем увеличить квоту, чтобы команда могла закончиться.

Например, следующая команда увеличивает квоту на размер объектов в конфигурации сеанса Microsoft.PowerShell на удаленном компьютере с 10 МБ (значение по умолчанию) до 11 МБ.

Set-PSSessionConfiguration -Name microsoft.PowerShell -MaximumReceivedObjectSizeMB 11 -Force

Для получения более подробной информации о командлете New-PSSessionOption см New-PSSessionOption.

Для получения более подробной информации о квотах WS-Management, можно посмотреть раздел справки для WS-Management провайдера («Get-Help WS-Management»).

 

Как решить ошибки тайм-аута

ОШИБКА: Служба WS-Management не может завершить операцию в течение времени, указанного в OperationTimeout.

ERROR: The WS-Management service cannot complete the operation within the time specified in OperationTimeout.

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

Следующие тайм-ауты доступны в базовой конфигурации.

— Провайдер WSMan (WSMan:) предоставляет на стороны клиента и сервера несколько  параметров тайм-аута, такие как настройка MaxTimeoutms в узле WSMan:\<ComputerName> и настройки EnumerationTimeoutms и MaxPacketRetrievalTimeSeconds в узле WSMan:\<ComputerName>\Service.

-Можно защитить локальный компьютер с помощью параметров CancelTimeout, IdleTimeout, OpenTimeout и OperationTimeout командлета New-PSSessionOption и привилегированной переменной $PSSessionOption.

— Также можно защитить удаленный компьютер, установив значения тайм-аутов для сессии программно в конфигурации сессии.

Когда значение тайм-аута не разрешает завершить операцию, Windows PowerShell прерывает операцию и генерирует сообщение об ошибке.

Для устранения этой ошибки, надо изменить удаленную команду для удовлетворения квоты. Или определить источник квоты, а затем увеличить квоту, чтобы команда могла закончиться.

Например, следующие команды используют командлет New-PSSessionOption для создания объекта параметра сеанса со значением OperationTimeout в 4 минуты (240000 MS), а затем используют объект параметра сеанса, чтобы создать удаленный сеанс.

C:\PS> $pso = New-PSSessionoption -OperationTimeout 240000
C:\PS> New-PSSession -ComputerName Server01 -sessionOption $pso

Для получения более подробной информации о тайм-аутах WS-Management, можно посмотреть раздел справки для поставщика WS-Management (например «Get-Help WSMan»).

Для получения более подробной информации о командлете New-PSSessionOption см New-PSSessionOption.

 

Поведение при зависания, поиск и исправление неисправностей

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

 

Как прервать команду

Некоторые программы Windows, такие как программы с пользовательским интерфейсом, консольные приложения, которые выводят подсказки и консольные приложения, использующие интерфейс Win32 API, не корректно работают в удаленном хосте Windows PowerShell.

При использовании этих программ, можно столкнуться с неожиданным поведением. Например, отсутствием вывода, частичной работой, или удаленная сессия которая не завершается.

Для завершения работы зависшей программы, нажмите CTRL + C. Для просмотра ошибок, которые возможно выводились, введите «$error» в локальном хосте и удаленном сеансе.

 

Как восстановиться после сбоя операции

ОШИБКА: Операция ввода/вывода была прервана из-за разрыва соединения или по запросу от приложения.

ERROR: The I/O operation has been aborted because of either a thread exit or an application request.

Эта ошибка возвращается, когда операция прерывается, до ее завершения. Как правило, это происходит, когда служба WinRM останавливается или перезапускается, а другие операции WinRM остаются в работе.

Чтобы решить эту проблему, убедитесь, что служба WinRM запущена и повторите команду.

1. Запустите Windows PowerShell с параметром «Запуск от имени администратора».
2. Выполните следующую команду:

Start-Service WinRM

3. Повторно запустите команду, которая генерировала ошибку.

СМОТРИТЕ ТАКЖЕ
about_Remote
about_Remote_Requirements
about_Remote_Variables

]]>
https://coolcode.ru/powershell-reshenie-problem-svyazyinnyih-s-udalyonnyim-podklyucheniem-about_remote_troubleshooting/feed/ 0
PowerShell. О требованиях к инраструктуре для работы дистанционного подключения. (about_Remote_Requirements) https://coolcode.ru/powershell-o-trebovaniyah-k-inrastrukture-dlya-rabotyi-distantsionnogo-podklyucheniya-about_remote_requirements/ https://coolcode.ru/powershell-o-trebovaniyah-k-inrastrukture-dlya-rabotyi-distantsionnogo-podklyucheniya-about_remote_requirements/#respond Wed, 09 Dec 2015 10:35:49 +0000 http://coolcode.ru/?p=5303

В этом разделе описываются требования к инфраструктуре, учётным записям и ресурсам для создания удаленных соединений и выполнения удаленных команд в Windows PowerShell. В данном разделе также содержится инструкция по настройки инфраструктуры для работы удаленных операций.

Примечание: Многие командлеты (в том числе командлеты Get-Service, Get-Process, Get-WMIObject, Get-EventLog, и Get-WinEvent) могут получать объекты с удаленных компьютеров с помощью методов для извлечения объектов Microsoft .NET Framework. Они не используют инфраструктуру удаленного взаимодействия Windows PowerShell. Требования в этом документе не распространяются на эти команды.

Чтобы найти командлеты, которые имеют параметр ComputerName, и не используют Windows PowerShell Remoting, можно воспользоваться командлетом Get-Command.

Get-Command -ParameterName ComputerName

Системные требования

Для запуска удаленных сеансов с поддержкой возможностей Windows PowerShell 3.0, локальные и удаленные компьютеры должны иметь следующее компоненты:
— Windows PowerShell 3.0 или более позднюю версию
— Платформу Microsoft .NET Framework 4.0 или более позднюю версию
— Windows Remote Management 3.0

Для запуска удаленных сеансов с возможностями Windows PowerShell 2.0, локальные и удаленные компьютеры должны иметь следующее компоненты:
— Windows PowerShell 2.0 или более позднюю версию
— Платформа Microsoft .NET Framework 2.0 или более позднюю версию
— Windows Remote Management 2.0

Можно создавать удалённые сеансы связи между компьютерами под управлением Windows PowerShell 2.0 и Windows PowerShell 3.0. Тем не менее, возможности удалённых соединений которые работают только на Windows PowerShell 3.0, например такое как способность переподключаться к сессиям, доступны только тогда, когда оба компьютеры работают под управлением Windows PowerShell 3.0.

Чтобы посмотреть номер версии Windows PowerShell установленной на текущем компьютере, можно воспользоваться автоматической переменной $PSVersionTable.

Windows Remote Management (WinRM) 3.0 и Microsoft .NET Framework 4.0 включены в Windows 8, Windows Server 2012, и новые выпуски операционных системы Windows. В более поздних операционных системах надо установить WinRM 3.0 он входит в Management Framework 3.0 для Windows. Если компьютер не имеет требуемой версии WinRM или Microsoft .NET Framework, произойдёт сбой установки.

 

Права пользователя

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

Разрешения необходимые для создания сессий и выполнения команд на удаленном компьютере (или в удаленной сессии на локальном компьютере) устанавливаются конфигурацией сеанса (также известной как «endpoint») на удаленном компьютере, к которому подключается сессия. В частности, дескриптор безопасности конфигурации сеанса определяет, кто имеет доступ к конфигурации сеанса и кто может использовать его для подключения.

По умолчанию, дескрипторы безопасности конфигураций сеансов  Microsoft.PowerShell, Microsoft.PowerShell32 и Microsoft.PowerShell.Workflow, разрешают доступ только для членов группы администраторов.

Если текущий пользователь не имеет разрешения на использование конфигурации сеанса, то команда запускающая команды (используется временная сессия) или создание постоянного сеанса на удаленном компьютере не удастся. Пользователь может использовать параметр командлетов ConfigurationName, которые создают сеансы с помощью другой конфигурации сеанса, если таковые имеются.

Члены группы администраторов на компьютере могут определить, кто имеет разрешение на подключение к компьютеру удаленно, изменяя дескрипторы безопасности в конфигурации сеансов по умолчанию или путём создания новых конфигураций сеансов с различными дескрипторами безопасности.

Для получения дополнительной информации о конфигурациях сеансов см about_Session_Configurations.

 

Сетевое окружение Windows

Начиная с Windows PowerShell 3.0, командлетом Enable-PSRemoting можно включить удаленное взаимодействие на клиентских и серверных операционных систем, в домене и общественных сетях.

На серверных версиях Windows в частных и доменных сетях, командлет Enable-PSRemoting создает правила брандмауэра, которые позволяют отключить ограничения удаленного доступа. Он также создает правило брандмауэра для общественных сетей, что разрешает удаленный доступ только с компьютеров в локальной подсети. Правило брандмауэра о локальных подсетях по умолчанию включена на серверных версиях операционных систем в сетях общего пользования, но Enable-PSRemoting повторно применяет правило, в случае если оно было изменено или удалено.

На клиентских версиях Windows в частных и доменных сетях, по умолчанию командлет Enable-PSRemoting создает правило брандмауэра, которое позволяет неограниченный удаленный доступ.

Чтобы включить удаленное взаимодействие на клиентских версиях Windows с сетями общего пользования, используется параметр SkipNetworkProfileCheck командлета Enable-PSRemoting. Это создаст правило брандмауэра, которое разрешает удаленный доступ только с компьютеров в локальной подсети.

Чтобы убрать ограничение только локальной подсетью и разрешить удаленный доступ из всех мест, в клиентских и серверных версиях Windows, используется командлет Set-NetFirewallRule из модуля NetSecurity. Надо выполнить следующую команду:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

В Windows PowerShell 2.0, на серверных версиях Windows, Enable-PSRemoting создает правила брандмауэра, которое разрешает удаленный доступ на все сети.

В Windows PowerShell 2.0, на клиентских версиях Windows, Enable-PSRemoting создает правила брандмауэра только для частных и доменных сетей. Если сетевое расположение является публичным, Enable-PSRemoting не выполнится.

 

Запуск от имени администратора

Права администратора требуются для выполнения следующих операций удаленного взаимодействия:
— Установление удаленного подключения к локальному компьютеру. Такое подключение называется «loopback» или «local» сессия.
— Настройка конфигурации сессии на локальном компьютере.
— Просмотр и изменение настроек WS-Management на локальном компьютере. Эти настройки находятся в узле LocalHost на диске WSMAN:.

Для выполнения этих задач, пользователь должен запустить Windows PowerShell с параметром «Запуск от имени администратора», даже если он является членом группы администраторов на локальном компьютере.

В Windows 7 и Windows Server 2008 R2, чтобы запустить Windows PowerShell с параметром «Запуск от имени администратора»:
1. Нажмите кнопку Пуск, выберите «Все программы», войдите в «Стандартные», а затем нажмите на папку «Windows PowerShell».
2. Щелкните правой кнопкой мыши на ярлык «Windows PowerShell», а затем нажмите кнопку «Запуск от имени администратора».

В ранних версиях Windows, чтобы запустить Windows PowerShell с параметром «Запуск от имени администратора»:
1. Нажмите кнопку «Пуск», выберите «Все программы», а затем зайдите папку «Windows PowerShell».
2. Щелкните правой кнопкой мыши на ярлык «Windows PowerShell», а затем нажмите кнопку «Запуск от имени администратора».

В проводнике Windows опция «Запуск от имени администратора», также доступна в других видах запуска Windows PowerShell, в том числе на ярлыках. Просто нажмите правой кнопкой мыши элемент, а затем нажмите кнопку «Запуск от имени администратора».

Когда вы запускете Windows PowerShell из другой программы, такой как Cmd.exe, используйте опцию «Run as administrator» при запуске программы.

Как настроить компьютер для удаленного доступа

Компьютеры под управлением всех поддерживаемых версий Windows, могут устанавливать удаленные подключения и выполнять удаленные команды в Windows PowerShell без предварительной конфигурации. Тем не менее, для получения соединения, и разрешения пользователям создавать локальные или удаленные сессии управления с помощь Windows PowerShell («сессии PSSession») и выполнять команды на локальном компьютере, необходимо включить удаленное взаимодействие Windows PowerShell на компьютере.

В Windows Server 2012 и более новых выпусках Windows Server удалённое взаимодействие включено в Windows PowerShell по умолчанию. Если настройки были изменены, можно восстановить настройки по умолчанию, выполнив командлет Enable-PSRemoting.

На всех других поддерживаемых версиях Windows, необходимо запустить командлет Enable-PSRemoting, чтобы включить удаленное взаимодействие Windows PowerShell.

Удаленное взаимодействия Windows PowerShell поддерживаются службой WinRM, которая является реализацией Microsoft протокола управления веб-службами(WS-Management). При включении удаленного взаимодействия Windows PowerShell, изменяется конфигурация по умолчанию WS-Management и добавляется конфигурация системы, которая позволит пользователям подключаться к WS-Management.

Чтобы настроить Windows PowerShell для получения удаленных команд:
1. Запустите Windows PowerShell с параметром «Запуск от имени администратора».
2. В командной строке введите:

Enable-PSRemoting

Чтобы убедиться, что служба удаленных соединений настроена правильно, можно выполнить проверочную команду, такую как следующей командлет, который создает удаленный сеанс на локальном компьютере.

New-PSSession

Если удаленное взаимодействие настроено правильно, команда создаст сеанс на локальном компьютере и вернет объект, представляющий сеанс. Вывод должен выглядеть примерно следующим:

C:\PS> new-pssession

Id Name        ComputerName    State    ConfigurationName
-- ----        ------------    -----    -----
1  Session1    localhost       Opened   Microsoft.PowerShell

Если команда не сработала, рекомендуется прочитать, about_Remote_Troubleshooting.

Определение политики

Когда вы работаете удаленно, используется два экземпляра Windows PowerShell, один на локальном компьютере и один на удаленном компьютере. В результате, ваша работа зависит от политики Windows и политики Windows PowerShell, на локальных и удаленных компьютерах.

Перед тем как установить соединение действует политика локального компьютера. Когда произошло соединение действует политика на удалённом компьютере.

]]>
https://coolcode.ru/powershell-o-trebovaniyah-k-inrastrukture-dlya-rabotyi-distantsionnogo-podklyucheniya-about_remote_requirements/feed/ 0
PowerShell. О удалённом подключении (about_Remote) https://coolcode.ru/powershell-o-udalyonnom-podklyuchenii-about_remote/ https://coolcode.ru/powershell-o-udalyonnom-podklyuchenii-about_remote/#respond Thu, 03 Dec 2015 11:00:22 +0000 http://coolcode.ru/?p=5293

С помощью PowerShell можно выполнить удаленные команды, как на одном компьютере, так и на нескольких компьютерах. Использовать как временное, так и постоянное подключение. Можно так же запустить интерактивный сеанс с одним удаленным компьютером.

В этом разделе приводится ряд примеров, показывающих, как работать с разными типами удаленных команд. Рекомендуется так же прочесть разделы справки, которые описывают каждый командлет, который используется в статье. Эта статья представляет подробную информацию и объясняет, как можно изменять команды под ваши потребности.

Примечание: Для использования Windows PowerShell Remoting, локальные и удаленные компьютеры должны быть настроены на удаленное взаимодействие. Для получения дополнительной информации см about_Remote_Requirements.

 

Как начать интерактивный сеанс (ENTER-PSSESSION)

Самый простой способ выполнять удаленные команды — это начать интерактивный сеанс с удаленным компьютером.
Когда начинается сессия, команды которые вы вводите, выполняются на удаленном компьютере, как если бы вы набрали их непосредственно на удаленном компьютере. Вы можете подключиться только к одному компьютеру в каждом интерактивном сеансе.

Чтобы начать интерактивный сеанс, используйте командлет Enter-PSSession.

Следующая команда начинает интерактивный сеанс с компьютером Server01:

Enter-PSSession Server01

Командная строка изменяется, чтобы указать, что вы подключены к компьютеру Server01.

Server01 \ PS>

Теперь можно вводить команды на компьютере Server01.
Чтобы завершить интерактивный сеанс, надо ввести:

Exit-PSSession

Для получения дополнительной информации см Enter-PSSession.

Как работать с командлетами, которые имеют параметр ComputerName для дистанционного получения данных

Некоторые командлеты имеют параметр ComputerName, он позволяет получать объекты с удаленных компьютеров.

Поскольку эти командлеты не используют WS-Management на базе Windows PowerShell Remoting, вы можете использовать параметр ComputerName этих командлетов на любом компьютере под управлением Windows PowerShell. Компьютеры могут быть не настроены для работы Windows PowerShell Remoting, и компьютеры могут не отвечать требованиям к системам для удаленного доступа.

Ниже приведён список командлетов имеющих параметр ComputerName:
Clear-EventLog
Get-Counter
Get-EventLog
Get-HotFix
Get-Process
Get-Service
Get-WinEvent
Get-WmiObject
Limit-EventLog
New-EventLog
Remove-EventLog
Restart-Computer
Stop-Computer
Show-EventLog
Test-Connection
Write-EventLog

Для примера, следующая команда получает службы на удаленном компьютере Server01:

Get-Service -ComputerName Server01

Обычно командлеты, поддерживающие удаленную работу без специальной настройки, имеют параметр ComputerName и не имеют параметра Session. Чтобы отобразить эти командлеты надо выполнить следующую команду:

Get-Command | where { $_.Parameters.Keys -contains "ComputerName" -and $_.Parameters.Keys -NotContains "Session"}

 

Как запустить команды удалённо

Для запуска команд, не поддерживающих параметр ComputerName, на удаленных компьютерах. Можно использовать командлет Invoke-Command.

Для указания списка компьютеров или одного компьютера можно воспользоваться параметром ComputerName. Для задания одной или несколько команд надо воспользоваться парамертом ScriptBlock.

Например, следующая команда выполняет команду Get-Culture на компьютере Server01.

Invoke-Command -ComputerName Server01 -scriptblock {Get-Culture}

Параметр ComputerName предназначен для ситуаций, в которых выполняется одна команда или несколько несвязанных команд, на одном или нескольких компьютерах. Чтобы установить постоянное подключение к удаленному компьютеру, надо использовать параметр Session.

Как создать постоянное соединение (PSsession)

При использовании параметра ComputerName и командлета Invoke-Command, оболочка Windows PowerShell устанавливает подключение только для данной команды. Затем, когда команда завершена, оболочка закрывает соединение. Любые переменные или функции, которые были определены в команде, будут потеряны.

Чтобы создать постоянное подключение к удаленному компьютеру, надо воспользоваться командлетом New-PSSession. Например, следующая команда создает сеансы PSSession на компьютерах Server01 и Server02, а затем сохраняет эти сеансы в переменной $s.

$s = New-PSSession -ComputerName Server01, Server02

Как выполнять команд в PSsession

Воспользовавшись PSSession, можно запустить серию удаленных команд, которые будут иметь одно общее окружение. И соответственно иметь общий доступ к таким данным, как функции, псевдонимы и значения переменных. Для запуска команды в PSSession, используется параметр Session в командлете Invoke-Command.

Например, следующая команда использует командлет Invoke-Command для выполнения командлета Get-Process в сеансах PSSession $s на компьютерах Server01 и Server02. Команда сохраняет процессы в переменной $р в каждом из сеансов PSSession.

Invoke-Command -Session $s -ScriptBlock {$p = Get-Process}

Так как PSSession использует постоянное подключение, вы можете запустить другую команду в той же сессии PSSession, в которой уже задана переменная $р. Следующая команда подсчитывает количество процессов, сохраненных в переменной $р.

Invoke-Command -Session $s -ScriptBlock {$p.count}

 

Как запустить удалённые команды на нескольких компьютерах

Для запуска удаленной команды на нескольких компьютерах, необходимо ввести все имена компьютеров в значении параметра ComputerName командлета Invoke-Command. Разделите имена компьютеров запятыми.

Например, следующая команда запускает команду Get-Culture на трех компьютерах:

Invoke-Command -ComputerName S1, S2, S3 -ScriptBlock {Get-Culture}

Можно так же запустить команду в нескольких сеансах PSSession. Следующие команды создают сеансы PSSession на компьютерах Server01, Server02, Server03 и затем выполняется команда Get-Culture в каждом из сеансов.

$s = New-PSSession -ComputerName Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Get-Culture}

Чтобы указать в списке компьютеров локальный компьютер надо ввести имя локального компьютера, точку (.) или localhost.

Invoke-Command -ComputerName S1, S2, S3, localhost -ScriptBlock {Get-Culture}

 

Как запустить скрипт на удаленных компьютерах

Чтобы запустить скрипт с локального компьютера, на удаленных компьютерах, надо использовать параметр FilePath командлета Invoke-Command.
Например, следующая команда запускает сценарий sample.ps1 на компьютерах S1 и S2:

Invoke-Command -ComputerName S1, S2 -FilePath C:\Test\Sample.ps1

Результат работы скрипта отображается на локальном компьютере. Для выполнения данного скрипта нет необходимости распространять файлы скрипта.

 

Как остановить удалённые команды

Чтобы прервать команду, надо нажать «CTRL» + «C». Запрос прерывания передастся на удаленный компьютер и завершит работу удаленного управления.

]]>
https://coolcode.ru/powershell-o-udalyonnom-podklyuchenii-about_remote/feed/ 0
PowerShell. О операторах (about_Operators) https://coolcode.ru/powershell-o-operatorah-about_operators/ https://coolcode.ru/powershell-o-operatorah-about_operators/#respond Wed, 02 Dec 2015 09:09:23 +0000 http://coolcode.ru/?p=5285

Операторы являются элементами языка, которые можно использовать в командах или выражениях. Windows PowerShell поддерживает несколько типов операторов, для управления значениями.

Арифметические операторы

Арифметические операторы (+, -, *, /,%) используются для вычисления значения в командах или выражениях. С помощью этих операторов можно складывать, вычитать, умножать, делить и вычислить модуль остатка от деления.

Арифметические операторы, также можно использовать со строками, массивами и хэш-таблицами. Оператор сложения объединяет элементы. Оператор умножения возвращает указанное число копий каждого элемента.

Для получения дополнительной информации см about_Arithmetic_Operators.

Операторы присваивания

Операторы присваивания (=, + =, — =, * =, / =,% =) используются , для присваивания одного или нескольких значений переменной, для изменения значения переменной и добавления значений переменной. Также переменной можно присвоить любой тип данных Microsoft .NET Framework, такие как String или DateTime, или Process.

Для получения дополнительной информации см about_Assignment_Operators.

Операторы сравнения

Операторы сравнения (-and, -or, -xor, -not, !) используются для сравнения значений и проверки условий. Например, вы можете сравнить два строковых значения, чтобы определить, равны ли они.

Операторы сравнения включают операторы соответствия (-match, -notmatch), которые находят шаблоны, используя регулярные выражения; Оператор замены (-replace), который использует регулярные выражения, чтобы изменить входные значения;
операторы подобия(-like, -notlike), которые находят шаблоны, используя групповые символы (*); и операторы проверки членства(-in, -notin, -contains, -notcontains), которые определяют, содержится ли значение в опорном наборе.

Они также включают в себя битовые операторы (-bAND, -bOR, -bXOR, -bNOT), для работы с битовыми значениями.

Для получения дополнительной информации см about_Comparison_Operators

Логические операторы

Логические операторы (-and, -or, -xor, -not, !) используются, для объединения булевых операций в единое логическое выражение. Например, можно используя логический оператор -and создать объект фильтра с двумя различными условиями.

Для получения дополнительной информации см about_Logical_Operators.

Операторы перенаправления

Операторы перенаправления (>, >>, 2>, 2>, и 2> & 1) используются для того, чтобы перенаправить вывод команды или выражения в текстовый файл. Операторы перенаправления работают как командлет Out-File (без параметров), но они также позволяют перенаправить вывод ошибок в указанные файлы. Вы также можете использовать Tee-Object данный командлет перенаправит вывод.

Для получения дополнительной информации см about_Redirection.

Операторы разединения и слияния

Оераторы -split и -join делят и объединяют подстроки. -split разбивает строку на подстроки. -join объединяет несколько строк в одну строку.

Для получения дополнительной информации см about_Split и about_Join.

Операторы типа

Операторы типа (-is, -isnot, -as) используются для того, чтобы найти или изменить тип .NET Framework объекта.

Для получения дополнительной информации см about_Type_Operators.

Унарные операторы

Унарные операторы увеличивают или уменьшают значения переменных или свойств объекта, и задают целым чиселам положительное или отрицательное значение. Например, чтобы увеличить значение переменной $а с 9 до 10, можно использовать следующую конструкцию: $a++.

Специальные операторы

Специальные операторы используются для выполнения задач, которые не могут быть выполнены другими типами операторов. Например, специальные операторы позволяют выполнять такие операции, как выполнение команд и изменение типа данных значения.

 

@() Оператор переопределения в Массив

Возвращает один или несколько значений, в виде массива.
Если есть только один элемент, массив имеет только одного члена.

@(Get-WMIObject Win32_LogicalDisk)

 

& Оператор вызова

Выполняет команду, скрипт или блок скрипта. Оператор вызова, также известный как «invocation operator», позволяет запускать команды, которые хранятся в переменных и представлены строками. Поскольку оператор вызова не анализирует команду, он не интерпретирует параметры команды.

C:\PS> $c = "get-executionpolicy"
C:\PS> $c
get-executionpolicy

C:\PS> & $c
AllSigned

 

[] Оператор перезаливки

Преобразует или пределывает объект в заданный тип. Если объекты не может быть преобразован, Windows PowerShell выдаёт ошибку.

[datetime]$birthday = "1/20/88"
[int64]$a = 34

 

, Оператор запятая

Как бинарный оператор(если элементов операции больше одного), запятая создает массив. При унарной операции(если элемент один), запятая создает массив с одним элементом. Для этого надо поместите запятую перед объектом.

$myArray = 1,2,3
$SingleArray = ,1

 

(. ) Точка оператор источников

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

. c:\scripts.sample.ps1

 

Примечание: После оператора точка следует пробел. Надо использовать пробел, чтобы отличить оператор точку от символом точки (.), который указывает на текущий каталог.

В следующем примере скрипт sample.ps1 в текущем каталоге выполняется в текущей области окружения.

. .\sample.ps1

 

-f оператор формата

Форматирует строки с помощью метода объекта формат строки. Введите строку формата с левой стороны от оператора и объект необходимо отформатировать с права от оператора.

C:\PS> "{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello 3.14

 

[] Оператор индекса

Выбор элементов в индексированных коллекциях, таких как массивы и хэш-таблицы. Индексы массива начинаются с нуля, поэтому первый объект индексируется как [0]. В массивах, можно использовать отрицательные индексы, чтобы получить элемент с конца массива([-1] последний элемент массива, [-2] предпоследний элемент массива). Хэш-таблицы индексируются значениями ключа.

C:\PS> $a = 1, 2, 3
C:\PS> $a[0]
1
C:\PS> $a[-1]
3
C:\PS> (get-hotfix | sort installedOn)[-1]
C:\PS> $h = @{key="value"; name="Windows PowerShell"; version="2.0"}
C:\PS> $h["name"]
Windows PowerShell
C:\PS> $x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
C:\PS> $x["doc"]
intro
-----
Once upon a time...

 

| («pipe»)Оператор конвеера

Перенаправляет («pipes») выходные данные команды дальше по конвееру на следующую за ней команду. Когда в исходящих данных более чем один объект («collection»), оператор конвейера передает объекты по одному.

get-process | get-member
get-pssnapin | where {$_.vendor -ne "Microsoft"}

. пересылка на свойства оператора.
Доступ к свойствам и методам объекта.
$myProcess.peakWorkingSet
(get-process PowerShell).kill()

 

.. Оператор диапазон

Создаёт последовательность целых чисел, как массив целых чисел, с заданными верхней и нижней границей.

1..10
10..1
foreach ($a in 1..$max) {write-host $a}

 

:: Оператор статических членов

Вызов статических свойств и методов из класса в .NET Framework. Чтобы найти статические свойства и методы объекта, используйте параметр Static командлета Get-Member.

[datetime]::now

 

$() Оператор подвыражения

Возвращает результат одного или нескольких операторов. Для одного результате возвращает единичное значение. Для нескольких результатов возвращает массив.

$($x * 23)
$(Get-WMIObject win32_Directory)

 

]]>
https://coolcode.ru/powershell-o-operatorah-about_operators/feed/ 0
PowerShell. О массивах (about_Arrays) https://coolcode.ru/o-massivah-about_arrays/ https://coolcode.ru/o-massivah-about_arrays/#comments Tue, 01 Dec 2015 09:23:05 +0000 http://coolcode.ru/?p=5274

Массив представляет собой структуру данных, которая предназначена для хранения набора элементов. Элементы могут быть одного и того же типа или различных типов.
Начиная с Windows PowerShell 3.0, нулевой элемент или одиночный объект имеют некоторые свойства массивов.

Создание и инициализация массива

Чтобы создать и инициализировать массив, нужно присвоить несколько значений переменной.
Значения, хранящиеся в массиве, разделяются запятой(,) и отделены от имени переменной оператором присваивания (=).
Например, чтобы создать массив с именем $A, который содержит семь числовых (INT) значения 22, 5, 10, 8, 12, 9, и 80, надо ввести:

$A = 22,5,10,8,12,9,80

 

Также можно создать и инициализировать массив, используя оператор диапазона (..). Например, чтобы создать и инициализировать массив с именем $B, который содержит значения с 5 по 8, необходимо ввести следующую конструкцию:

$B = 5..8

 

В результате $B будет содержать четыре значения: 5, 6, 7 и 8.

Если тип данных не задан, Windows PowerShell создает массив как массив объектов (тип: System.Object []). Чтобы узнать тип данных массива, используйте метод GetType(). Например, чтобы узнать тип данных массива $a, выполните:

$a.GetType()

 

Чтобы создать типизированный массив, то есть массив, который может содержать только значения определенного типа, надо задайть тип массива, например, String[], long[] или int32[]. Чтобы задать тип массива, перед именем переменной массива в квадратных скобках укажите тип. Например, чтобы создать массив содержащий 32-битные целые числа с именем $IA, содержащий четыре числа (1500, 2230, 3350, и 4000), выполните:

[Int32[]] $ia = 1500,2230,3350,4000

 

В результате массив $IA будет содержать только целые числа.

Можно создавать массивы, которые поддерживают любой из типов платформы Microsoft .NET Framework. Например, объекты которые отдаёт Get-Process представляют собой процессы типа System.Diagnostics.Process. Чтобы создать типизированный массив объектов процессов, введите следующую команду:

[Diagnostics.Process []] $ZZ = Get-Process

 

Оператор переопределения в массив (@)

Оператор переопределения(@) создает массив, даже если он не содержит элементов или содержит только один объект.

Синтаксис оператора массива выглядит следующим образом:
@(…)

Вы можете использовать оператор массива для создания массива нулевого значения или содержащий один объект. Пример:

$а = @("Один")
$a.Count
1

$b = @()
$b.Count
0

 

Оператор массива особенно полезен в сценариях, когда вы получаете объекты, но не знаете, сколько объектов вы получите.

$р = @(Get-Process notepad)

 

Для получения более подробной информации об операторе переопределения в массив, см about_Operators.

 

Чтение массива

Обратиться к массиву можно используя имя переменной массива. Чтобы отобразить все элементы в массиве, надо ввести имя массива. Например:

$a

 

К элементам массива можно обратиться с помощью индекса, начиная с 0. Заключая число в скобках. Например, чтобы отобразить первый элемент массива $a, надо ввести:

$а[0]

 

Для отображения третьего элемента массива $a, надо ввести:

$а[2]

 

Отрицательные числа, в индексе массива, обзначают осчёт от конца массива. Например, «-1» обозначает последний элемент массива. Для отображения последних трех элементов массива, типа:

$а[-3..- 1]

 

Однако, будьте осторожны при использовании этого обозначения.

$а[0..- 2]

 

Эта команда не отображает все элементы массива кроме последнего. Она отображает первый, последний, и предпоследний элемент в массиве. Т.е эквивалентна:
$а[0,- 2,-1]

Можно использовать оператор диапазона для отображения подмножество значений в массиве. Например, чтобы отобразить элементы данных с индексами от 1 до 3, надо ввести:

$а[1..3]

 

Можно использовать оператор плюс (+), чтобы объединить диапазоны элементов в задании индексов массива. Например, чтобы отобразить элементы с индексами 0, 2 и с 4 по 6, надо ввести:

$а[0,2 + 4..6]

 

Чтобы определить, сколько содержится элементов в массиве, используйте свойство Length или его псевдоним Count.

$a.Count

Чтобы обратиться к элементам массива, можно так же использовать циклические операторы, например ForEach. Для того, чтобы пройтись по всему массиву $a и отобразить все его элементы, введите следующую конструкцию:

foeach ($element in $a){$element}

Оператор цикла Foreach проходит по всем элементам массива $a и возвращает каждое значение элемента массива в переменную $element, пока не достигнит конца массива.

Также полезен цикл For, в нём указываются параметры счётчика. Например, для отображения каждого второго элемента можно использовать следующий цикл:

for ($i = 0; $i -le ($a.length - 1); $i += 2) {$a[$i]}

 

While можно использовать для прохода по массиву пока не нарушаются указанные условия. Например, чтобы отобразитьпервые 4 элемента в массиве $a, необходимо написать:

$i=0
while($i -lt 4) {$a[$i]; $i++}

 

Просмотр свойств массива

Чтобы посмотреть свойства и методы массива, например для получения длины массива(Length) или метод для установки значения элемента в массиве (SetValue), используйте параметр InputObject командлета Get-Member.

При передаче массива по конвееру в командлет Get-Member, Windows PowerShell отправляет объекты по одному и Get-Member возвращает тип каждого элемента в массиве. Например:

$a|Get-Member

 

При использовании параметра InputObject, Get-Member возвращает свойства массива.
Например, следующая команда получает свойства массива $a:

Get-Member -InputObject $a

 

Вы также можете получить свойства массива, набрав запятую (,) перед его обозначением и передав по конвееру в командлет Get-Member. Запятая конвертирует массив, как значение содержащееся в другом массиве с одним элементом. Так Windows PowerShell передаёт по контейнеру массивы по одному за раз и этот элемент является массивом, то Get-Member возвращает свойства массива.

,$а|Get-Member

,(1,2,3)|Get-Member

 

Работа с массивами

При работе с массивами можно изменить значение элементов в массиве, добавить элементы в массив и объединить значения из двух массивов в третий массив.

Чтобы изменить значение конкретного элемента массива, нужно указать имя массива и индекс элемента, который надо изменить, а затем использовать оператор присваивания (=), чтобы указать новое значение для элемента. Например, чтобы изменить значение второго элемента (индекс элемента 1) в массиве $a на значение 10 , необходимо написать:

$a[1] = 10

 

Можно так же изменить значение используя метод массива — SetValue. В следующем примере изменяется значение второго элемента (индекс 1) массива $a на 500:

$a.setValue (500,1)

 

Можно использовать оператор +=, чтобы добавить элемент в массив. Когда вы используете его, Windows PowerShell на самом деле создает новый массив со значениями исходного массива и добавленными элементами. Например, чтобы добавить элемент со значением 200 в массив $a, надо ввести:

$а += 200

 

Удалить элементы из массива не просто, но вы можете создать новый массив, который содержит только выбранные элементы существующего массива. Например, чтобы создать массив $t со всеми элементами в массиве $a за исключение элемента с индексом 2, надо выполнить следующий скрипт:

$t = $а[0,1 + 3..($a.length-1)]

 

Чтобы объединить два массива в один массив, используйте оператор плюс (+). В следующем примере создается два массива, и объединяеются в третий, а затем отображает полученный объединенный массив.

$x = 1,3
$y = 5,9
$z = $x + $y
$z

 

В результате массив $z содержит элементы со значениями: 1, 3, 5 и 9.

Чтобы удалить массив, надо присвоить значение $null к массиву. Следующая команда удаляет массив в переменной $a.

$а=$NULL

 

Можно так же использовать командлет Remove-Item, но назначать значение $null быстрее, особенно для больших массивов.

 

Массивы нулевой длинны и из одного элемента

Начиная с Windows PowerShell 3.0, коллекции из нуля объектов или из одного объекта имеют свойства Count и Length. Кроме того, вы можете получить индекс из массива одного объекта. Эти функции помогут избежать ошибок сценариев, когда команда которая ожидает массив, получает менее двух элементов.

Следующие примеры демонстрируют эти функцию.

Нет объектов:

$a = $null
$a.Count
0
$a.Length
0

 

Один объект:

$a = 4
$a.Count
1
$a.Length
1
$a[0]
4
$a[-1]
4

 

]]>
https://coolcode.ru/o-massivah-about_arrays/feed/ 1
QT справочник. Основы https://coolcode.ru/qt-spravochnik-osnovyi/ https://coolcode.ru/qt-spravochnik-osnovyi/#respond Sat, 24 Oct 2015 07:49:50 +0000 http://coolcode.ru/?p=4458

Проектный файл

Сигналы/Слоты

Объектная иерархия

Глобальные определения Qt

Контейнеры в Qt

Строки QString

Проектный файл:

Обозначение библиотек в проектном файле:

Библиотека Обозначение в проектном файле
QtCore core
QtGui gui
QtWidgets widgets
QtQuick quick1
QtQML qml
QtNetwork network
QLOpenGL opengl
QtSql sql
QtSvg svg
QtXml xml
QtXmlPatterns xmlpatterns
QtScript script
QtScriptTools scripttools
QtMultimedia multimedia
QtMultimediaWidgets Multimediawidgets
QtWebKit webkit
QtWebKitWidgets webkitwidgets
QPrintSupport printsupport
QtTest test

 

Опции проектного файла :

Опция назначение
HEADERS Список созданных заголовочных файлов.
SOURCES Список созданных файлов реализации(с расширением cpp)
FORMS Список файлов с расширением ui.
TARGET Имя приложения
LIBS Список библиотек, которые должны быть подключены для создания исполняемого модуля.
CONFIG Задаёт опции которые должен использовать компилятор.
DESTDIR Задаёт путь, куда будет помещён готовый исполняемый модуль.
DEFINED Передать опции для компилятора.
INCLUDEPATH Путь к каталогу, где содержаться заголовочные файлы.
DEPENDPATH Раздел для указания зависимостей, необходимых для компиляции.
SUBDIRS Имена подкаталогов, которые содержат pro-файлы.
TEMPLATE Задает разновидность проекта.
TRANSLATIONS Задает файлы переводов, используемые в проекте.

 

Сигналы/Слоты:

Шаблон класса использующего слоты и сигналы.

class 'имя класса' : public 'класс наследованный от QObject'
  {
    Q_OBJECT //макрос указывает на использовании сигналов и слотов в классе
    public:
      'открытые функции и переменные класса'
      public slots:
        'открытые слоты класса'
        void 'имя слота'('параметры слота');
      signals:
        'сигналы класса'
        void 'имя сигнала'('параметры сигнала');
      private:
        'закрытые функции и переменные класса'
      private slots:
        'закрытые слоты класса'
        void 'имя слота'('параметры слота');
  }

 

Определение слота:

void 'имя класса'::'имя слота'('параметры слота')
  {
    'тело слота';
  }

 

Послать сигнал:

emit 'имя сигнала' ('параметр');

 

Соединение сигнала и слота:

QObject::connect(&'имя объекта содержащего сигнал',&'имя типа объекта содержащего сигнал'::'имя сигнала',
                 &'имя объекта содержащего слот',&'имя типа объекта содержащего слот'::'имя слота');

или

QObject::connect(&'имя объекта содержащего сигнал',SIGNAL('имя сигнала'('параметры сигнала')),
                 &'имя объекта содержащего слот',SLOT('параметры слота'));

 

Соединение двух сигналов в объекте унаследованном от QObject:

connect(SIGNAL('имя сигнала1'('параметры сигнала1')),
        SIGNAL('имя сигнала2'('параметры сигнала2')));

 

Разъединение сигнала и слота:

QObject::disconnect(&'имя объекта содержащего сигнал',&'имя типа объекта содержащего сигнал'::'имя сигнала',
                    &'имя объекта содержащего слот',&'имя типа объекта содержащего слот'::'имя слота');

или

QObject::disconnect(&'имя объекта содержащего сигнал',SIGNAL('имя сигнала'('параметры сигнала')),
                    &'имя объекта содержащего слот',SLOT('параметры слота'));

 

Заблокировать отправку сигналов:

blockSignals(false);

 

Разблокировать отправку сигналов:

blockSignals(true);

 

Проверить состояние сигналов:

signalsBlocked()

 

Объектная иерархия.

Объявление объекта :

'класс объекта'* 'имя объекта' = new 'класс объекта'('указатель на объект предка');

Если предка нет, объект является объектом верхнего уровня.

 

Таблица методов, для просмотра иерархии классов:

Перед выполнением команды из примера выполняется следующий код:

QObject* obj1 = new QObject;
QObject* obj2 = new QObject(obj1);
QObject* obj3 = new QObject(obj1);
QObject* obj4 = new QObject(obj2);
obj1->setObjectName("Object name 1");
obj2->setObjectName("Object name 2");
obj3->setObjectName("Object name 3");
obj4->setObjectName("Object name 4");

 

Метод объекта Описание Пример
setObjectName('отладочное имя объекта'); Задать имя объекта для отладки программы obj1 -> setObjectName(«Object name»);//obj1 -> ObjectName() = «Object name»
ObjectName() Получить имя объекта для отладки программы  QString SNam = obj1 -> objectName(); //SNam = «Object name 1»
parent() Возвращает указатель на объект-предка  QObject* obj = obj2 -> parent(); //obj = obj1
children() Возвращает указатель на объект-потомок QObjectList Lobj = obj1->children();//Lobj содержит объекты obj2 и obj3
dumpObjectTree() Возвращает в поток вывода stdout дерево объектов-потомков obj1 -> dumpObjectTree();//В stdout выведется:
QObject::Object name 1
 QObject::Object name 2
   QObject::Object name 4
 QObject::Object name 3
dumpObjectInfo()  Возвращает в поток вывода stdout информацию об объекте. Имя объекта, класс от которого был создан объект, сигнально-слотовые соединения.  obj2 -> dumpObjectInfo();//В stdout выведется:
OBJECT QObject::Object name 2
 SIGNALS OUT
   <None>
 SIGNALS IN
   <None>

 

Глобальные определения Qt

Типы переменных Qt

Тип Qt Эквивалент C++ Размер в битах
qint8 signed char 8
quint8 unsigned char 8
qint16 short 16
quint16 unsigned short 16
qint32 int 32
quint32 unsigned int 32
qint64 __int64 или long long 64
quint64 unsigned __int64 или unsigned long long 64
qlonglong Тоже самое, что и qint64 64
qulonglong Тоже самое, что и quint64 64
qreal Тоже самое,что и double 64
uchar Тоже самое,что и unsigned char 8

 

Функции Qt:

Функции Описание Пример
const char * qVersion() Возвращает версию библиотеки qDebug()<<qVersion();
const T & qMax(const T & v1, const T & v2) Возвращает максимальное значение из v1 и v2 int n = qMax<int>(3,5); // n = 5
const T & qMin(const T & v1, const T & v2) Возвращает минимальное значение из v1 и v2 int n = qMin<int>(3,5); // n = 3
T qAbs(const T & v) Возвращает абсолютное значение v int n = qAbs(-5); // n = 5
int qRound(qreal v) 
qint64 qRound64(qreal v)
Возвращает округлённое значение v int n = qRound(5.7); // n = 6
 int n = qRound(-5.7); // n = -6
const T & qBound(const T & v1,const T & v2,const T & v3) Возвращает значение между минимом и максимумом int n = qBound(2,12,7);//n = 7
int n = qBound(1,7,7);//n = 7
bool qFuzzyCompare(float f1,float f2)
bool qFuzzyCompare(double d1, double d2)
Сравнение двух значений с плавающей точкой. bool b = qFuzzyCompare(1.0,1.0); //b = true
quint32 qFloatDistance(float f1,float f2)
quint64 qFloatDistance(double d1, double d2)
Возвращает кол-во чисел, которые можно расположить между 1 и 2 переменной float f1=1.10001,f2=1.10002;
quint32 n = qFloatDistance(f1,f2); // n = 84
bool qIsFinite(double d)
bool qIsFinite(float f)
Возвращает истину, если параметр число. float f1;
f1 = sqrt(-13);
//f1 = nan
qIsFinite(f1);//false
double qInf() Функция возвращающая бесконечность. float f1 = 1/qInf(); //f1 = 0
f1 = qInf()/qInf(); //f1 = nan
bool qIsInf(double d)
bool qIsInf(float f)
Функция возвращает true если параметр равен бесконечности bool b=qIsInf(qInf());//b=true
double qQNaN() Функция возвращает значение quiet NaN (не исчеслимо) float f=qQNaN(); //f = nan
double qSNaN() Функция возвращает значение signalling NaN (не исчеслимо) float f=qSNaN(); //f = nan
bool qIsNaN(double d)
bool qIsNaN(float f)
 Функция возвращает true если параметр не исчислим float f1 =sqrt(-13);
bool b=qIsNaN(f1);

 

Контейнеры в Qt:

Последовательные контейнеры:

имя класса название класса
QVector<T>  вектор
QList<T> список
QLinkedList<T> двусвязный список
QStack<T> стек
QQueue<T> очередь

 

Ассоциативные контейнеры:

имя класса название класса
QSet<T> множество
QMap<K,T> словарь
QltiMap<K,T> мультисловарь
QHash<K,T> хэш
QMultiUash<K,T> мультихэш

 

Операторы контейнерных классов:

Оператор/Меторд Описание
== Операторы сравнения равно
!= Операторы сравнения не равно
= Операторы присваивания
[] Операторы индексации. QSet<T> и QLinkedList<T> не поддреживают оператор.
begin() и constBegin() Методы возвращающие интераторы, установленные на начало последовательности элементов контейнера. Для класса QSet<T> возвращает только константные значения.
end() и constEnd() Методы возвращающие константные интераторы, установленные на конец последовательности элементов контейнера.
clear() Удаление всех элементов контейнера.
insert() Операция вставки элементов в контейнер.
remove() Операция удаления элементов из контейнера.
size() и count() Возвращают кол-во элементов контейнера. Предпочтительней size(), так как соответствует STL.
value() Возвращает элемент контейнера в QSet<T> не определён.
empty() и isEmpty() Возвращают true, если контейнер не содержит ни одного элемента.Предпочтительней empty(), так как соответствует STL.

 

Интераторы в стиле Java:

QListInterator — Интератор на чтение,QMutableListInterator на запись.

 

Список интераторов в стиле Java:

Q[Mutable]ListInterator, Q[Mutable]linkedListInterator, Q[Mutable]VectorInterator, Q[Mutable]HashInterator, Q[Mutable]MapInterator, Q[Mutable]SetInterator

 

Пример использования:

QList<Qstring> list;
list<<"1"<<"2"<<"3";
QListInterator<QString> it(list);
while (it.hasNext()){
  qDebug()<<it.next();
}

 

Методы для итераторов

Q[Mutable]ListInterator, Q[Mutable]linkedListInterator, Q[Mutable]VectorInterator, Q[Mutable]HashInterator, Q[Mutable]MapInterator, Q[Mutable]SetInterator

Методы Описание
toFront() Перемещает интератор на начало списка.
toBack() Перемещает интератор на конец списка.
hasNext() возвращает значение true, если интератор не находится в конце списка.
next() Возвращает значение следующего элемента списка и перемещает интератор на следующую позицию.
peekNext() Возвращает значение следующего элемента списка, без изменения позиции интератора.
hasPrevious() Возвращает значение true, если интератор не находится в начале списка.
previous() Возвращает значение предыдущего элемента списка и перемещает интератор на предыдущую позицию.
peekPrevious() Возвращает значение предыдущего элемента списка, без изменения позиции интератора.
findNext(const T&) Поиск заданного элемента в прямом направлении.
findPrecious(const T&) Поиск заданного элемента в обратном направлении.

 

Методы для итераторов

QMutableListInterator, QMutablelinkedListInterator, QMutableVectorInterator, QMutableHashInterator, QMutableMapInterator, QMutableSetInterator

remove() Удаляет текущий элемент.
insert() Вставить элемент на текущую позицию.
setValue() Присвоить элементу значение.

 

Интераторы в стиле STL

Двигаемся вперёд, по контейнеру:

QVector<QString> vec;
vec<<"1"<<"2"<<"3";
QVector<QString>::interator it = vec.begin();
for(; it != vec.end(); ++it){
  qDebug()<<"El:"<< *it;
}

 

Двигаемся назад по контейнеру:

QVector<QString> vec;
vec<<"1"<<"2"<<"3";
QVector<QString>::interator it = vec.end();
for(; it != vec.begin();){
  --it;
  qDebug()<<"El:"<< *it;
}

 

Если значение не меняется эффективнее использовать константные итераторы:

QVector<QString> vec;
vec<<"1"<<"2"<<"3";
QVector<QString>::const_interator it = vec.constBegin();
for(; it != vec.constEnd(); ++it){
  qDebug()<<"El:"<< *it;
}

 

foreach — изменения в нём не влияют на на оригинальный контейнер.

QList<Qstring> list;
list<<"1"<<"2"<<"3";
foreach(QString str, list){
  qDebug()<<"El:"<<str;
}

 

Последовательные контейнеры:

Методы последовательных контейнеров:

Оператор/метод Описание
+ Объединяет элементы двух контейнеров
+= и << Добавляет элемент в контейнер.
at() Возвращает указанный элемент.
back() и last() Возвращает ссылку на последний элемент.Применение back() предпочтительней, так как он соответствует STL.
contains() Проверяет, содержится ли переданный в качестве параметра элемент в контейнере.
erase() Удаляет элемент, расположенный на позиции интератора, передаваемого в качестве параметра.
front() и first() Возвращает ссылку на первый элемент контейнера.Применение front() предпочтительней, так как он соответствует STL.
indexOf() Возвращает позицию первого совпадения найденного в контейнере элемента в соответствии с переданным в метод значением. В контейнере LinkedList этот метод отсутствует.
lastIndexOf() Возвращает позицию последнего совпадения найденного в контейнере элемента в соответствии с переданным в метод значением. В контейнере LinkedList этот метод отсутствует.
mid() Возвращает контейнер, содержащий копии элементов, задаваемых начальной позицией и количеством
pop_back() Удаляет последний элемент контейнера.
pop_front() Удаляет первый элемент контейнера.
push_back() и append() Методы добавляют один элемент в конец контейнера.Применение push_back() предпочтительней, так как он соответствует STL.
push_frotn() и prepend() Методы добавляют один элемент в начало контейнера.Применение push_frotn() предпочтительней, так как он соответствует STL.
replace() Заменяет элемент, находящийся на задней позиции, значением переданным как параметр к методу.

 

Вектор QVector<T>

Не эффективные методы push_front(),prepend(),pop_front(),remove(),insert()

Метод Описание
data() Возвращает указатель на данные вектора.
fill() Присваивает одно и тоже значение всем элементам вектора.
reserve() Резервирует кол-во памяти для кол-ва элементов в соответствии с переданным значением
resize() Устанавливает размер вектора в соответствии с переданным значением.
toList() Возвращает объект QList с элементами, содержащимися в векторе.
toStdVector() Возвращает объект std::vector с элементами, содержащимися в векторе.

 

Массив байтов QByteArray

Метод Описание
qCompress() Сжатие данных.
qUncompress() Распоковка данных.
toBase64() Преобразование бинарных данных в текст.
fromBase64() Преобразование бинарных данных из текстового формата Base64.

 

Массив битов QBitArray

Метод Описание
testBit() чтение
setBit() запись

 

Списки QList<T> и QLinkedList<T>

QList yе эффективные методы insert()- в середину списка, для вставки лучше использовать QLinkedList<T>. Если надо прочитать элемент то вместо то [], надо использовать at().

Методы Описание
move() Перемещение элемента с одной позиции на другую.
removeFirst() Удаляет первый элемент списка.
removeLast() Удаляет последний элемент списка.
swap() Меняем местами два элемента на указанных позициях.
takeAt() Возвращает элемент на указанной позиции и удаляет его.
takeFirst() Удаляет первый элемент и возвращает его.
takeLast() Удаляет последний элемент и возвращает его.
toSet() Возвращает контейнер QSet<T> с данными, содержащимися в объекте QList<T>
toStdList() Возвращает стандартный список STL std::list<T> с элементами, содержащимися в объекте QList<T>
toVector() Возвращает объект вектора QVector<T> с элементами, содержащимися в объекте QList<T>

 

QList<int> list;
list << 10 << 20 <<30;
QValueList<int>::iterator it = list.begin();
while(it != list.end()){
  qDebug() <<"El:"<< *it;
  ++it;
}

 

Стек Stack<T>

Метод Описание
push() Добавить объект в стек.
pop() Получить объект из стека.
top() Ссылка на элемент вершины стека.

 

Очередь QQueue<T>

Метод Описание
enqueue() Добавить элемент в очередь.
dequeue() Получить элемент из очереди.

 

Ассоциативные контейнеры

Метод Описание
contains() Возвращает значение true, если контейнер содержит элемент с заданным ключём. Иначе false.
erase() Удаляет элемент из контейнера в соответствии с переданным итератором.
find() Осуществляет поиск элемента по значению. В случае успеха возвращает итератор, указывающий на этот элемент. В случае не удачи итератор ссылается на end().
insertMulti() Вставляет в контейнер новый элемент.Если элемент уже присутствует в контейнере, создаётся новый элемент. Отсутствует в QSet().
insert() Вставляет в контейнер новый элемент.Если элемент уже присутствует в контейнере, он замещается новым элементом. Отсутствует в QSet().
key() Возвращает первый ключ в соответствии с переданным в этот метод значением. Отсутствует в QSet().
keys() Возвращает список всех ключей, находящихся в контейнере. Отсутствует в QSet().
take() Удаляет элемент из контейнера в соответствии с переданным ключом и возвращает копию его значения. Отсутствует в QSet().
unite() Добавляет элементы одного контейнера в другой.
values() Возвращает список всех значений, находящихся в контейнере.

 

Словари QMap<K,T> и QMultiMap<K,T>

Метод Описание
lowerBound() Возвращает итератор, указывающий на первый элемент с заданным ключом.
toStdMap() Возвращает стандартный словарь STL с элементами, находящимися в объекте QMap<T>
upperBound() Возвращает итератор, указывающий на последний элемент с заданным ключом.

 

Хэши QHash<K,T> и QMultiHash<K,T>

Метод Описание
capacity() Возвращает размер хэш-таблицы.
reserve() Задает размер хэш-таблицы.
squeeze() Уменьшает объем внутренней хэш-таблицы для уменьшения используемого объема памяти.

 

Множество QSet<T>

unite() Объединение двух множеств.
intersect() Пересечение двух множеств.
subtract() Разность двух множеств.
reserve() Задает размер хэш-таблицы.
scueeze() Уменьшает объём хэш-таблицы для уменьшения используемого объема памяти.
toList() Возвращает объект контейнера QList<T>, содеражщий элементы из объекта контейнера

 

Алгоритмы QtAlgorithms

Алгоритм Описание
qBinaryFind() Двоичный поиск заданных значений.
qCopy() Копирование элементов начиная с первого
qCopyBackward() Копирование элементов начиная с последнего.
qCount() Подсчет элементов контейнера.
qDeleteAll() Удаление всех элементов.Элементы контейнера не должны быть константными указателями.
qEqual() Сравнение. Должен быть определен оператор ==.
qFill() Присваивает всем элементам контейнера заданное значение.
qFind() Поиск заданных значений.
qLowerBound() Нахождение первого элемента со значением, большим либо равным заданному.
qUpperBound() Нахождение первого элемента со значением, строго большим заданному.
qSort() Сортировка элементов.
qStableSort() Сортировка элементов с сохранением порядка следования равных элементов.
qSwap() Перемена двух значений местами.

 

Строки QString

Методы и операторы, для строк:

Метод или Оператор Описание Пример
= Оператор присваивания QString s1 = «abcd»;
QString s1 = «def»;
==,!=,<,>,<=,>= Логические операторы s1!=s2;
s1 <s2;
isEppty() Проверка на пустую строку. s1.isEmpty();
isNull() Проверка на нулевую строку. s1.isNull();
length() Длина строки. s1.length();
+=,+,append() Объединение строк. s1=s1+s2;
s1+=s2;s1.append(s2);
replace() замена подстроки. s1.replace(«ab»,»12»);
toLower(),toUpper() Приведение к единому регистру. s1.toUpper();
s1.toLower();
setNum(),number() Конвертация числового значения в строку. s1.setNum(12);
s1 = QString::number(12);
toDouble(),toInt() Конвертация строки в числовое значение. int i = QString(«123»).toInt();
split() Разбить строку на подстроки. QStringList l = QString(«asd as qw qwe awe»).split(» «);
join() Объединить список в строку. QList<QString> l;
l<< «as» <<«sd»<<«asd»;
QString s = l.join(» «);

 

Регулярные выражения. QRegExp.

Символ Описание Пример
. Любой символ a.b
$ Должен быть конец строки Abc$
[] Любой символ из заданного набора [abc]
- Определяет диапазон символов в группе[] [0-9A-Za-z]
^ В начале набора символов означает любой символ, не вошедший в набор [^def]
* Символ должен встретиться в строке ни разу или несколько раз A*b
+ Символ должен встретиться в строке минимум 1 раз A+b
? Сивол должен встретиться в строке 1 раз или не разу A?b
{n} Символ должен встретиться в строке указанное число раз A{3}b
{n,} Допускается минимум n совпадений a{3,}b
{,n} Допускается до n совпадений a{,3}b
{n,m} Допускается от n до m совпадений a{2,3}b
| Ищет один из двух символов ac|bc
\b В этом месте присутствует граница слова a\b
\B Границы слова нет в этом месте a\Bb
() Ищет и сохраняет в памяти группу найденных символов (ab|ac)ad
\d Любое число
\D Все, кроме числа
\s Любой тип пробелов
\S Все, кроме пробелов
\w Любая буква, цифра или знак подчёркивания
\W Все, кроме букв
\A Начало строки
\b Целое слово
\B Не слово
\Z Конец строки(символ конца строки или перевод каретки)
\z Конец строки(символ конца строки)
]]>
https://coolcode.ru/qt-spravochnik-osnovyi/feed/ 0
PowerShell. Работа с файлами, импорт и экспорт объектов в текстовые файлы. https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/ https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/#respond Tue, 04 Aug 2015 06:41:18 +0000 http://coolcode.ru/?p=3219

В данной статье описано, как записать и получить данные из файла при работе с PowerShell.

В этой статье описаны следующие темы:
Операторы перенаправления
Командлеты Set-Content, Add-Content
Командлет Out-File
Командлет Tee-Object
Командлет Get-Content
Командлет Export-CSV
Командлет Import-Csv
Командлет Import-Clixml
Командлет Export-Clixml

Операторы перенаправления.

В powershell, как и в командной строке есть способ перенаправить поток вывода и ошибок в файл. Как и в командной строке в PowerShell существуют операторы перенаправления.

Для того, что бы перенаправить поток консольного вывода в файл, необходимо после команды написать знак «>» ,если нужно затереть данные в файле, или «>>» , если данные надо дописать в конец файла, а потом полный путь к файлу.

Пример:

PS C:\temp> Get-ChildItem


 Каталог: C:\temp


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 29.07.2015 13:27 4472 1.csv
-a--- 30.07.2015 13:02 0 1.txt


PS C:\temp> Get-ChildItem > 1.txt
PS C:\temp> 
PS C:\temp> Get-Content 1.txt


 Каталог: C:\temp


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 29.07.2015 13:27 4472 1.csv
-a--- 30.07.2015 13:15 788 1.txt

Первая команда «Get-ChildItem» выводит свой результат работы в консоль,

Вторая «Get-ChildItem > 1.txt» записывает результат работы в файл «1.txt» текущей директории.

Рассмотрим ещё один пример:

PS C:\temp> Get-ChildItem skdjfsdlj
Get-ChildItem : Не удается найти путь "C:\temp\skdjfsdlj", так как он не существует.
строка:1 знак:4
+ dir <<<<  skdjfsdlj
    + CategoryInfo          : ObjectNotFound: (C:\temp\skdjfsdlj:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS C:\temp> Get-ChildItem skdjfsdlj > 1.txt
Get-ChildItem : Не удается найти путь "C:\temp\skdjfsdlj", так как он не существует.
строка:1 знак:4
+ dir <<<<  skdjfsdlj > 1.txt
    + CategoryInfo          : ObjectNotFound: (C:\temp\skdjfsdlj:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS C:\temp>

После выполнения команд файл 1.txt останется пустым. А ошибка отобразилась в консоли. Если поток ошибок надо так же перенаправить в файл, то в конце команды надо дописать 2>&1.

Пример:

Get-ChildItem lkdjflds >1.txt 2>&1

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

PS C:\temp> Get-ChildItem asdfsadf > 1.txt 2>&1
PS C:\temp>
PS C:\temp> Get-content 1.txt
Get-ChildItem : Не удается найти путь "C:\temp\asdfsadf", так как он не существует.
строка:1 знак:14
+ Get-ChildItem <<<<  asdfsadf > 1.txt 2>&1
    + CategoryInfo          : ObjectNotFound: (C:\temp\asdfsadf:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS C:\temp>

В этом примере мы перенаправили второй поток вывода в первый, а первый поток записали в файл.

 

В PowerShell существуют следующие потоки:

Поток Варианты использования Описание
0 Поток ввода
1 >filename|>>filename Поток информационных сообщений
2 2>filename|2>>filename|2>&1 Поток сообщений с ошибоками
В PowerShell 3.0 появилось ещё несколько потоков:
3 3>filename|3>>filename|3>&1 Поток предупреждений.
4 4>filename|4>>filename|4>&1 Поток подробного вывода.
5 5>filename|5>>filename|5>&1 Поток диагностики.
* *>filename|*>>filename Все потоки.

 

 

Set-Content, Add-Content

Так же для записи в файл можно использовать командлеты Set-Content и Add-Content. Эти командлеты заменяет все данные в файле на указанные. Перед записью они преобразовывают объекты в строки и не всегда удобны. Зато они могут использоваться для массового изменения файлов. Простейшая их запись выглядит так:

Set-content 1.txt "Hello"

Add-content 1.txt "Hello"

Данная команда заменит все данные в файле 1.txt на Слово «Hello». Если файла на момент запуска нет, то он создастся.

При работе с файловой системой командлеты могут применять следующие параметры:

 

-Value «Объект для записи»

В этом параметре нужно указывать новое содержимое элементов.

Пример:

Set-content 1.txt -value "Hello"

Данная команда изменит содержимое файла «1.txt» на «Hello»

Ещё пример:

PS C:\Temp> Add-content -Path 1.txt -value "Hello1","Hello2"
PS C:\Temp>

Добавляет к файлу 1.txt, текущей дирректории, две строки «Hello1» и «Hello2»

Название параметра можно опустить, тогда предыдущие примеры будет выглядеть так:

Set-content 1.txt "Hello"

Add-content -Path 1.txt "Hello1","Hello2"

Данный параметр, так же можно передавать по контейнеру.

Но в файл попадут не данные как на консоли,  а преобразованные в текстовые строки объекты.

Пример:

PS C:\temp> Get-ChildItem


    Каталог: C:\temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        30.07.2015     16:34          4 1.csv
-a---        30.07.2015     16:45         83 1.txt
-a---        30.07.2015     15:04          8 1.xml
-a---        30.07.2015     16:34          4 2.csv
-a---        30.07.2015     16:34          4 2.txt
-a---        30.07.2015     15:04          8 2.xml
-a---        30.07.2015     16:34          4 212.txt
-a---        30.07.2015     16:34          4 22.txt
-a---        30.07.2015     16:34          4 3.txt
-a---        30.07.2015     15:04          8 3.xml
-a---        30.07.2015     16:34          4 temp.txt


PS C:\temp> Get-ChildItem | Set-Content 1.txt
PS C:\temp> Get-Content 1.txt
1.csv
1.txt
1.xml
2.csv
2.txt
2.xml
212.txt
22.txt
3.txt
3.xml
temp.txt

Тоже самое произойдёт, если в параметр -value передать переменную:

Path[0]: PS C:\temp> $a=Get-ChildItem
PS C:\temp> Set-Content 1.txt -value $a
PS C:\temp> Set-Content 2.txt -value $a
PS C:\temp> Get-Content 2.txt
1.csv
1.txt
1.xml
2.csv
2.txt
2.xml
212.txt
22.txt
3.txt
3.xml
temp.txt

 

-LiteralPath «путь до файла(ов)»

В этом параметре надо указывать точный путь до файла. Можно использовать перечисление файлов, через  «,» (запятую).

PS C:\temp> Set-content -literalPath 1.txt , 2.txt "Hello"

Данная команда изменит данные в файлах текущей директории «1.txt» и «2.txt» на «Hello»

или можно добавить данные:

Add-content -literalPath 1.txt , 2.txt "Hello"

 

-Path «строка с шаблоном пути до файлов»

Данный параметр подставляется автоматически если его не указывать явно и в нём указываются шаблон для файлов, которые будут подвергаться изменению.

Например команда:

Set-content C:\temp\*.txt "Hello"

Заменит содержимое всех файлов в дирректории «C:\temp\» с типом *.txt на «Hello».

Можно так же добавить строку «Hello» к файлам в дирректории «C:\temp\» и «C:\temp2\» одним командлетом:

Set-content C:\temp\*,C:\temp2\* "Hello"

 

-Force

Параметр -Force позволяет проводить действия, даже с файлами у которых стоит атрибут «Только на чтение».

PS C:\temp> Set-content -Path "C:\temp\1.txt" -value "33"
Set-Content : Отказано в доступе по пути "C:\temp\1.txt".
строка:1 знак:12
+ Set-content <<<<  -Path "C:\temp\1.txt" -value "33"
    + CategoryInfo          : NotSpecified: (:) [Set-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetContentCommand

PS C:\temp> Set-content -Path "C:\temp\1.txt" -value "33" -force
PS C:\temp>

При выполнении команды «Set-content -Path «C:\temp\1.txt» -value «33»». Появилась ошибка, так как на файле стоит атрибут «только на чтение», вторая команда прошла успешно.

Тоже самое и для Add-Content:

PS C:\temp> Add-Content -Path "C:\temp\1.txt" -value "33"
Add-Content : Отказано в доступе по пути "C:\temp\1.txt".
строка:1 знак:12
+ Add-Content <<<<  -Path "C:\temp\1.txt" -value "33"
    + CategoryInfo          : NotSpecified: (:) [Set-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetContentCommand

PS C:\temp> Add-Content -Path "C:\temp\1.txt" -value "33" -force
PS C:\temp>

 

-Filter «шаблон имени»

В этом параметре можно указать шаблон имени файла.

Пример:

PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Filter "*.txt" -value "Hello2"

Данная команда заменит значение всех файлов с типом «*.txt» в дирректриях «C:\temp» и «C:\temp2»

 

-Include «шаблоны имён»

В отличии от параметра «-Filter»  в -Include можно указывать несколько шаблонов одновременно.

Пример:

PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt"

В этой команде заменится содержимое всех файлов с типом «*.txt» и «.doc» в директориях «C:\temp» и «C:\temp2»

или добавить содержимое:

PS C:\temp> Add-Content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt"

 

-Exclude «Шаблон исключений пути файлов»

Данный параметр отбрасывает файлы удовлетворяющие «Шаблон исключений пути файлов», из списка найденных по шаблону в параметре «-Path». Но не влияет на файлы указанные в параметре -LiteralPath.

Пример:

PS C:\temp> Set-content -Path *.txt -Exclude ?.txt "22"

Данная команда установит содержимое всех файлов с типом «txt» на 22, кроме текстовых файлов у которых имя файла без типа, содержит один символ.

Так же и для Add-Content:

PS C:\temp> Add-Content -Path *.txt -Exclude ?.txt "22"

 

-PassThru

Данный параметр позволяет передать объекты дальше по контейнеру, или вывести объекты на консоль, если данный командлет является последним.

Пример:

PS C:\temp> Get-ChildItem | Set-Content 1.txt -PassThru |gm


   TypeName: System.Object[]

Name           MemberType    Definition
----           ----------    ----------
Count          AliasProperty Count = Length
Address        Method        System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934...
Clone          Method        System.Object Clone()
CopyTo         Method        System.Void CopyTo(array array, int index), System.Void CopyTo(array array, long index)
Equals         Method        bool Equals(System.Object obj)
Get            Method        System.Object Get(int )

 

-Confirm

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

Пример:

PS C:\temp> Set-Content 1.txt "Hello" -Confirm

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Установка содержимого" над целевым объектом "Путь: C:\temp\1.txt".
[Y] Да - Y  [A] Да для всех - A  [N] Нет - N  [L] Нет для всех - L  [S] Приостановить - S  [?] Справка
(значением по умолчанию является "Y"):N
PS C:\temp>

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

 

 

Out-File

В простейшем варианте этот командлет выглядит так:

get-childitem | Out-File 2.txt

При выполнении данной команды, get-childitem передаст содержимое каталога на командлет Out-File, а он запишет его в файл «2.txt» в текущем каталоге. При этом если файл «2.txt» существует, то командлет его перезапишет.

Out-File может принимать следующие параметры:

 

-FilePath «Имя файла»

В этом параметре нужно указывать имя файла или полный путь до файла в который будет записаны данные.

Имя данного параметра можно опустить, как мы и сделали в предыдущем примере.

Полная запись будет выглядеть так:

get-childitem | Out-File -FilePath 2.txt

 

-Append

При указании данного параметра данные будут дописываться, а не затираться.

Тоесть если мы запустим команду:

get-childitem | Out-File -FilePath 2.txt -Append

То данные будут дописываться в конец файла «2.txt».

 

-NoClobber

Данный параметр предотвращает перезапись существующих данных.

Если запусnить команду :

get-childitem | Out-File -FilePath 2.txt -NoClobber

При уже имеющемся файле 2.txt

То получится ошибка:

Out-File : Файл "C:\temp\2.txt" уже существует.
строка:1 знак:25
+ get-childitem | Out-File <<<< -FilePath 2.txt -NoClobber
+ CategoryInfo : ResourceExists: (C:\temp\2.txt:String) [Out-File], IOException
+ FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.OutFileCommand

Однако с параметром -Append

get-childitem | Out-File -FilePath 2.txt -NoClobber -Append

Сохранности данных ничего не угрожает и данные благополучно допишутся в конец файла.

 

-Confirm

Параметр указывает, что перед выполнением команды у пользователя будет запрошено подтвержение.

При выполнении данной команды:

get-childitem | Out-File -FilePath 2.txt -Confirm

Выведется следующее сообщение:

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Вывод в файл" над целевым объектом "2.txt".
[Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка
(значением по умолчанию является "Y"):

 

-Force

Перезаписать файл с атрибутом «Только на чтение».

То есть команда:

get-childitem 234234f 2>&1 | Out-file 2.txt -force

Позволяет переписать файл 2.txt даже если в Атррибуте будет стоят галочка «Только на чтение».

PowershellAndFiles3

При этом после записи в этот файл, галка не уберётся.

 

-Encoding «Тип кодировки»

Задаёт метод кодировки в файле можно писать файл в следующих кодировках: «Unicode», «UTF7», «UTF8», «UTF32», «ASCII», «BigEndianUnicode» и «OEM». По умолчанию использует кодировку «Unicode».

Пример:

get-childitem 234234f 2>&1 | Out-file 2.txt -Encoding "ASCII"

 

-InputObject «Переменная»

Данный параметр позволяет сохранять в файл объект. При этом отображение этого объекта в консоли и сохраннёные данные в файл, могут визуально не совпадать

Например создадим вложенный массив :

$a1 = 1,2,3

$a2 = $a1,$a1,$a1

Посмотрим на массив:

$a2|Out-File 2.txt; $a2

В данном примере и в файле и в консоле будет одно и тоже:

1
2
3
1
2
3
1
2
3

Запишем объект массива в файл, через параметр -InputObject:

Out-File -InputObject $a2 2.txt;$a2

Теперь в консоли будет выводиться :

1
2
3
1
2
3
1
2
3

А в файл :

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

 

-Width «Ширина в символах»

Указывает максимальное кол-во символов в строке, при превышении данного значения, строка обрезается.

Пример:

Get-ChildItem |Out-File .\2.txt -Width 40

Получился вот такой файл:

Каталог: C:\temp


ПРЕДУПРЕЖДЕНИЕ: столбец Name не поместил
ся на экране и был удален.

Mode                LastWriteTime Length
----                ------------- ------
-a---        21.07.2015     12:39    117
-a---        21.07.2015     17:33    458
-a---        21.07.2015     16:43   1709

 

Данный инструмент намного функциональней, чем просто перенаправление в файл, но он как и перенаправление имеет один не достаток, эти способы могут быть только в конце контейнера. И после данных выводов в файл объекты дальше не передаются. Это позволяет избежать следующий командлет:

 

 

Tee-Object

Этот командлет сохраняет отображаемые объекты и передаёт их дальше по контейнеру.

Пример:

Get-ChildItem *.txt|Tee-Object 3.txt |Get-Content

Данная команда сначала выполнит «Get-ChildItem *.txt»   получит список всех файлов заканчивающихся на *.txt, и передаст их  Tee-Object 3.txt. Tee-Object 3.txt сохранит список всех файлов в файле 3.txt, и передаст список дальше. Get-Content выведет всё содержимое файлов на консоль.

 

-FilePath

«Tee-Object 3.txt» это сокращённа форма записи, мы опустили имя свойства «FilePath» Которое указывает в какой файл записать данные.

Пример:

Tee-Object -FilePath 3.txt

Так же с помощью свойства

 

-Variable «Имя переменной»

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

Пример:

Get-ChildItem *.txt|Tee-Object -Variable listfile |Get-Content

После выполнения этой команды в переменной $listfile будет содержаться объект типа System.IO.FileInfo

Так же как и в Out-File в Tee-Object можно передать переменную на командлет:

 

-InputObject «Переменная»

Пример:

PS C:\temp> Tee-Object -InputObject $a2 -Variable a3


Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3



PS C:\temp> $a3
1
2
3
1
2
3
1
2
3

 

Только в PoverShell 3.0 Tee-Object научился дописывать в файл с помощью параметра

-Append

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

Пример:

Get-ChildItem *.txt|Tee-Object 3.txt -Append|Get-Content

После выполнения данной командой данные допишутся в конец файла 3.txt, а не будут перезаписывать файл.

 

 

Get-Content

Для того, что бы получать данные из текстовых файлов, имеется командлет Get-Content.

У него есть ряд параметров, которые работают так же как и в Set-Content:

 

-LiteralPath «Путь до файла»

Задает путь к элементу. В отличие от значения параметра Path, значение параметра LiteralPath используется точно в том виде, в котором оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, его нужно заключить в одиночные кавычки. Одиночные кавычки указывают оболочке Windows PowerShell, что никакие символы не следует интерпретировать как escape-символы.

Пример:

PS C:\Temp> Get-content -LiteralPath C:\temp\1.txt,C:\temp\1.txt,C:\temp\1.txt
Hello
Hello
Hello

Команда выводит последовательно  3 раза файл 1.txt. Если перенаправить это в файл, то можно склеить несколько текстовых файлов в один:

PS C:\Temp> Get-content -LiteralPath C:\temp\1.txt,C:\temp\1.txt,C:\temp\1.txt|set-content 4.txt

 

-Path «Шаблоны для файлов»

Задает путь к элементу. Для извлечения содержимого используется командлет Get-Content. Подстановочные знаки разрешены. Имя параметра («Path» или «FilePath») указывать необязательно.

Пример:

PS C:\Temp> Get-content -Path C:\temp\*.txt |set-content 5.txt

Данная команда записывает содержимое всех файлов с типом «.txt» в файл «5.txt» текущей директории.

 

-Filter «шаблон файлов»

Задает фильтр с использованием формата или языка поставщика. Значение этого параметра определяет значение параметра Path. Синтаксис фильтра, в том числе использование подстановочных знаков, зависит от поставщика. Фильтры эффективнее других параметров, потому что поставщик применяет их при извлечении объектов (вместо использования Windows PowerShell для фильтрации извлеченных объектов).

Пример:

PS C:\Temp> Get-content -Path C:\temp\*,C:\temp2\* -filter *.csv |set-content 5.csv
Get-Content : Объект для указанного пути C:\temp\* не существует или отфильтрован с помощью параметра -Include или -Exc
lude.
строка:1 знак:12
+ Get-content <<<<  -Path C:\temp\*,C:\temp2\* -filter *.csv |set-content 5.csv
    + CategoryInfo          : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand
PS C:\Temp>

В данном примере у меня в директории «C:\temp2\» нет файлов с типом «*.csv», поэтому возникает данная ошибка, однако все csv файлы из директории «C:\temp\» успешно записались в файл «5.csv»

 

-Include «шаблоны файлов»

Извлекает только указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Пример:

PS C:\Temp> Get-content -Path C:\temp\* -Include *.csv,*.txt |set-content 6.txt

Записывает в файл 6.txt всё содержимое файлов с типом «*.csv» «*.txt» в дирректории «C:\Temp» .

 

-Exclude «шаблоны файлов»

Исключает указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Пример:

Get-content -Path C:\temp\* -Exclude *.txt,*.csv |set-content 6.doc

Записывает в файл 6.doc все файлы из дирректории «C:\temp\*» не содержащие типов «*.txt» и «*.csv»

 

-Force

Переопределяет ограничения, препятствующие выполнению команды, не ставя под угрозу безопасность. Например, параметр Force позволяет переопределить атрибут «только чтение» .

PS C:\Temp> Get-content -Path C:\temp\* -force

 

И два особенных параметра:

 

-TotalCount «Число отображаемых срок»

Данный параметр задает количество извлекаемых строк содержимого. По умолчанию используется значение -1 (все строки).

PS C:\temp> Get-Content 1.txt -TotalCount 5
1 line
2 line
3 line
4 line
5 line
PS C:\temp>

Данная команда вывела ровно 5 строк из файла 1.txt

 

-ReadCount «Число строк»

Задаёт количество строк передаваемых по конвееру.

Пример:

PS C:\temp> Get-Content 1.txt -ReadCount 5 |foreach{$_+"-------"}
1.csv
1.txt
1.xml
2.csv
2.txt
-------
2.xml
212.txt
22.txt
3.txt
3.xml
-------
temp.txt
-------
PS C:\temp>

На примере видно, что строки передаются по 5 штук.

Если вывод происходит на консоль, то большое число в данном параметре может существенно увеличить скорость выдачи информации, но увеличит время ожидания до выдачи первых строк.

 

Данные команды конечно расширяют возможности работы с данными в файлах Powershell, но полученные данные с помощью операторов перенаправления или командлетами Out-File и Tee-Object больше подходят для логирования процессов, нежели  для анализа данных. К тому же использовать полученные данные в дальнейших скриптах не тривиальная задача. Для решения этих проблем в PowerShell есть командлеты Import-CSV,Export-CSV, Export-Clixml, Import-Clixml. Рассмотрим их по отдельности:

 

Export-CSV

Раз я веду разговор о записи в файл, именно этот командлет мне нужен. Но стоит упоменуть о командлете ConvertTo-CSV. Так как  Export-CSV выполняет все действия ConvertTo-CSV, а после записывает в файл. Поэтому если вам не хватает функционала работы с файлами командлета  Export-CSV то вы можете конвертировать объекты PowerShell с помощью ConvertTo-CSV, а помом записать полученный результат удобным вам способом.

Рассмотрим свойства данного командлета:

 

-Path «путь к файлу»

Данный параметр обязательный и задаёт имя файла, в который будут записываться данные.

Рассмотрим пример:

Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv

Сначала получаем список файлов директории «Get-ChildItem *.*» ипередаём по конвееру. Выбираем свойства объекта «Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length» и передаём их на экспорт. После экспортируем их в файл 1.csv c помощью командлета  Export-Csv 1.csv, мы опустили название свойства -Path в полном варианте записи командлет выглядел бы как: Export-Csv -Path 1.csv

У нас в итоге получился файл 1.csv который можно открыть в большенстве табличных редакторах.

#TYPE Selected.System.IO.FileInfo
"FullName","CreationTime","LastWriteTime","Attributes","Length"
"C:\temp\1.csv","22.07.2015 10:54:38","22.07.2015 11:02:04","Archive","0"
"C:\temp\1.txt","21.07.2015 12:37:21","21.07.2015 12:39:14","Archive","117"
"C:\temp\2.txt","21.07.2015 13:52:47","22.07.2015 9:14:34","Archive","46"
"C:\temp\3.txt","21.07.2015 16:32:26","22.07.2015 9:21:11","Archive","56"

 

-Force

Параметр Force — позволяет перезаписать файл с выставленным атрибутом «только на чтение» в тихом режиме.

Пример:

PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8"
Export-Csv : Отказано в доступе по пути "C:\temp\1.csv".
строка:1 знак:101
+ Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv <<<<  1.csv -Enc
oding "UTF8"
    + CategoryInfo          : OpenError: (:) [Export-Csv], UnauthorizedAccessException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ExportCsvCommand

PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8" -Force
PS C:\temp>

 

-NoClobber

Данный параметр предотвращает перезаписать файла.

PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv
PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -NoClobber
Export-Csv : Файл "C:\temp\1.csv" уже существует.
строка:1 знак:101
+ Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv <<<<  1.csv  -No
Clobber
    + CategoryInfo          : ResourceExists: (C:\temp\1.csv:String) [Export-Csv], IOException
    + FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.ExportCsvCommand

PS C:\temp>

 

-Confirm

Ещё один способ избежать перезаписи, ручной конроль данной операции «-Confirm». Если указать параметр Confirm, то при выполнении команды будет выведен запрос на подтверждение выполнения команды.

Пример:

PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Confirm

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Export-Csv" над целевым объектом "1.csv".
[Y] Да - Y  [A] Да для всех - A  [N] Нет - N  [L] Нет для всех - L  [S] Приостановить - S  [?] Справка
(значением по умолчанию является "Y"):Y
PS C:\temp>

 

-NoTypeInformation

Убирает из файла строчку с данныйми о типах

После выполнения данной команды:

PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -NoTypeInformation

Получается вот такой файл:

"FullName","CreationTime","LastWriteTime","Attributes","Length"
"C:\temp\1.txt","21.07.2015 12:37:21","21.07.2015 12:39:14","Archive","117"
"C:\temp\2.txt","21.07.2015 13:52:47","22.07.2015 9:14:34","Archive","46"
"C:\temp\3.txt","21.07.2015 16:32:26","22.07.2015 9:21:11","Archive","56"

Первой строчки «#TYPE Selected.System.IO.FileInfo» нет.

 

-Delimiter «Разделитель столбцов»

Этим параметром можно переназначить разделитель на любой символ. По умолчанию разделителем является «,»(запятая).

Пример:

Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Delimiter ";"

В результате получится следующий файл:

#TYPE Selected.System.IO.FileInfo
"FullName";"CreationTime";"LastWriteTime";"Attributes";"Length"
"C:\temp\1.csv";"22.07.2015 10:54:38";"22.07.2015 15:13:29";"Archive";"0"
"C:\temp\1.txt";"21.07.2015 12:37:21";"21.07.2015 12:39:14";"Archive";"117"
"C:\temp\2.txt";"21.07.2015 13:52:47";"22.07.2015 9:14:34";"Archive";"46"
"C:\temp\3.txt";"21.07.2015 16:32:26";"22.07.2015 9:21:11";"Archive";"56"

 

-UseCulture

Использовать разделитель исходя из языковых настроек операционной системы. Узнать, что будет использоваться в данной консоли, можно выполнив команду :

(Get-Culture).TextInfo.ListSeparator

Пример использования:

PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -UseCulture

При моих настройках компьютера:

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)

Разделителем является «;».

И соответсвенно получился вот такой файл:

#TYPE Selected.System.IO.FileInfo
"FullName";"CreationTime";"LastWriteTime";"Attributes";"Length"
"C:\temp\1.txt";"21.07.2015 12:37:21";"21.07.2015 12:39:14";"Archive";"117"
"C:\temp\2.txt";"21.07.2015 13:52:47";"22.07.2015 9:14:34";"Archive";"46"
"C:\temp\3.txt";"21.07.2015 16:32:26";"22.07.2015 9:21:11";"Archive";"56"

 

-Encoding «кодировка»

Позволяет задать кодировку конечного файла. Может принимать следующие значения «Unicode», «UTF7», «UTF8», «ASCII», «UTF32», «BigEndianUnicode», «OEM».

По умолчанию используется «ASCII»

Пример:

Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8"

 

-InputObject «переменная»

Позволяет передавать в командлет переменную для экспорта её в файл. При этом экспортироваться будут свойства переменной, но не её содержимое.

Пример:

PS C:\temp> $d= Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length
PS C:\temp> Export-Csv -InputObject $d 2.csv

Получился вот такой файл.

#TYPE System.Object[]
"Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
"3","3","3","1","System.Object[]","False","True","False"

 

 

Import-Csv

Для импорта файлов Csv в переменные, существует командлет Import-csv. При экспорте, а потом импорте объектов с объектом происходит ряд трансформаций.Теряются методы объекта, вместо них появляются методы Equals, GetHashCode, GetType и ToString.  Все свойсва объекта конвертируются в их строковые версии.

Так же Import-Csv может Загрузить в объект файл который ни когда не являлся объектом PowerShell.

 

Рассмотрим параметры данного командлета:

 

-Path «путь к csv файлу»

Этот параметр задаёт путь к файлу, из которого будут загружаться данные.

Рассмотрим пример:

PS C:\temp> Get-ChildItem *.* | Export-Csv 1.csv
PS C:\temp> $a =  Import-Csv .\1.csv
PS C:\temp> $a|ft
PSPath      PSParentPat PSChildName PSDrive     PSProvider  PSIsContain VersionInfo BaseName    Mode        Name
            h                                               er
------      ----------- ----------- -------     ----------  ----------- ----------- --------    ----        ----
Microsof... Microsof... 1.csv       C           Microsof... False       File:   ... 1           -a---       1.csv
Microsof... Microsof... 1.txt       C           Microsof... False       File:   ... 1           -a---       1.txt
Microsof... Microsof... 2.csv       C           Microsof... False       File:   ... 2           -a---       2.csv
Microsof... Microsof... 2.txt       C           Microsof... False       File:   ... 2           -a---       2.txt
Microsof... Microsof... 3.txt       C           Microsof... False       File:   ... 3           -a---       3.txt
Microsof... Microsof... temp.txt    C           Microsof... False       File:   ... temp        -a---       temp.txt

Здесь мы сначала экспортировали данные директории в сsv файл, вот такого содержания:

#TYPE System.IO.FileInfo
"PSPath","PSParentPath","PSChildName","PSDrive","PSProvider","PSIsContainer","VersionInfo","BaseName","Mode","Name","Length","DirectoryName","Directory","IsReadOnly","Exists","FullName","Extension","CreationTime","CreationTimeUtc","LastAccessTime","LastAccessTimeUtc","LastWriteTime","LastWriteTimeUtc","Attributes"
"Microsoft.PowerShell.Core\FileSystem::C:\temp\1.csv","Microsoft.PowerShell.Core\FileSystem::C:\temp","1.csv","C","Microsoft.PowerShell.Core\FileSystem","False","File:             C:\temp\1.csv
InternalName:     
OriginalFilename: 
FileVersion:      
FileDescription:  
Product:          
ProductVersion:   
Debug:            False
Patched:          False
PreRelease:       False
PrivateBuild:     False
SpecialBuild:     False
Language:         
","1","-a---","1.csv","0","C:\temp","C:\temp","False","True","C:\temp\1.csv",".csv","22.07.2015 10:54:38","22.07.2015 4:54:38","22.07.2015 10:54:38","22.07.2015 4:54:38","29.07.2015 13:27:56","29.07.2015 7:27:56","Archive"
"Microsoft.PowerShell.Core\FileSystem::C:\temp\1.txt","Microsoft.PowerShell.Core\FileSystem::C:\temp","1.txt","C","Microsoft.PowerShell.Core\FileSystem","False","File:             C:\temp\1.txt
InternalName:     
OriginalFilename: 
FileVersion:      
FileDescription:  
Product:          
ProductVersion:   
Debug:            False
Patched:          False
PreRelease:       False
PrivateBuild:     False
SpecialBuild:     False
Language:         
","1","-a---","1.txt","117","C:\temp","C:\temp","False","True","C:\temp\1.txt",".txt","21.07.2015 12:37:21","21.07.2015 6:37:21","21.07.2015 12:37:21","21.07.2015 6:37:21","21.07.2015 12:39:14","21.07.2015 6:39:14","Archive"

и т.д.

далее импортировали его в переменную $a

при выводе переменной $a мы увидели свойства дирректории…

Посмотрим на эту переменную внимательней:

PS C:\temp> $a | gm -force


   TypeName: CSV:System.IO.FileInfo

Name              MemberType   Definition
----              ----------   ----------
pstypenames       CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, mscorlib, Version=2.0.0.0...
psadapted         MemberSet    psadapted {ToString, Equals, GetHashCode, GetType}
psbase            MemberSet    psbase {ToString, Equals, GetHashCode, GetType}
psextended        MemberSet    psextended {PSPath, PSParentPath, PSChildName, PSDrive, PSProvider, PSIsContainer, Ve...
psobject          MemberSet    psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, g...
Equals            Method       bool Equals(System.Object obj)
GetHashCode       Method       int GetHashCode()
GetType           Method       type GetType()
ToString          Method       string ToString()
Attributes        NoteProperty System.String Attributes=Archive
BaseName          NoteProperty System.String BaseName=1
CreationTime      NoteProperty System.String CreationTime=22.07.2015 10:54:38
CreationTimeUtc   NoteProperty System.String CreationTimeUtc=22.07.2015 4:54:38
Directory         NoteProperty System.String Directory=C:\temp
DirectoryName     NoteProperty System.String DirectoryName=C:\temp
Exists            NoteProperty System.String Exists=True
Extension         NoteProperty System.String Extension=.csv
FullName          NoteProperty System.String FullName=C:\temp\1.csv
IsReadOnly        NoteProperty System.String IsReadOnly=False
LastAccessTime    NoteProperty System.String LastAccessTime=22.07.2015 10:54:38
LastAccessTimeUtc NoteProperty System.String LastAccessTimeUtc=22.07.2015 4:54:38
LastWriteTime     NoteProperty System.String LastWriteTime=29.07.2015 13:27:56
LastWriteTimeUtc  NoteProperty System.String LastWriteTimeUtc=29.07.2015 7:27:56
Length            NoteProperty System.String Length=0
Mode              NoteProperty System.String Mode=-a---
Name              NoteProperty System.String Name=1.csv
PSChildName       NoteProperty System.String PSChildName=1.csv
PSDrive           NoteProperty System.String PSDrive=C
PSIsContainer     NoteProperty System.String PSIsContainer=False
PSParentPath      NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp
PSPath            NoteProperty System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\1.csv
PSProvider        NoteProperty System.String PSProvider=Microsoft.PowerShell.Core\FileSystem
VersionInfo       NoteProperty System.String VersionInfo=File:             C:\temp\1.csv...

Мы увидем, что свойства этой переменной имеют тип System.String, а так же у нас отсутствуют методы :

Свойственные типу System.IO.FileInfo

PS C:\temp> dir *.* | gm -MemberType Method


   TypeName: System.IO.FileInfo

Name                      MemberType Definition
----                      ---------- ----------
AppendText                Method     System.IO.StreamWriter AppendText()
CopyTo                    Method     System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(strin...
Create                    Method     System.IO.FileStream Create()
CreateObjRef              Method     System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateText                Method     System.IO.StreamWriter CreateText()
Decrypt                   Method     System.Void Decrypt()
Delete                    Method     System.Void Delete()
Encrypt                   Method     System.Void Encrypt()
Equals                    Method     bool Equals(System.Object obj)
GetAccessControl          Method     System.Security.AccessControl.FileSecurity GetAccessControl(), System.Security....
GetHashCode               Method     int GetHashCode()
GetLifetimeService        Method     System.Object GetLifetimeService()
GetObjectData             Method     System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo info, ...
GetType                   Method     type GetType()
InitializeLifetimeService Method     System.Object InitializeLifetimeService()
MoveTo                    Method     System.Void MoveTo(string destFileName)
Open                      Method     System.IO.FileStream Open(System.IO.FileMode mode), System.IO.FileStream Open(S...
OpenRead                  Method     System.IO.FileStream OpenRead()
OpenText                  Method     System.IO.StreamReader OpenText()
OpenWrite                 Method     System.IO.FileStream OpenWrite()
Refresh                   Method     System.Void Refresh()
Replace                   Method     System.IO.FileInfo Replace(string destinationFileName, string destinationBackup...
SetAccessControl          Method     System.Void SetAccessControl(System.Security.AccessControl.FileSecurity fileSec...
ToString                  Method     string ToString()

 

-Header «Заголовок»

У файла который мы будем импортировать можно добавить заголовок параметром Header

Попытаемся импортировать файл 1.csv с изменённым заголовком:

PS C:\temp> $a =  Import-Csv .\1.csv -Header 'Path','-','Name','Disk'
PS C:\temp> $a

Path                          -                             Name                          Disk
----                          -                             ---                           ----
PSPath                        PSParentPath                  PSChildName                   PSDrive
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.csv                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.csv                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 3.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... temp.txt                      C

Заметим, что свойства на которых не хватило именования не вошли в переменную $a, если бы в шапке оказалось бы больше именований столбцов, чем свойств в файле. То свойстива с этими именами остались бы пустыми.

В основном она не нужна и поэтому убирается либо в файле перед импортом, либо из объектов после:

PS C:\temp> $a = $a |Where-Object {$_.Disk -ne "PSDrive"}
PS C:\temp> $a

Path                          -                             Name                          Disk
----                          -                             ----                          ----
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.csv                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.csv                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 3.txt                         C
Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... temp.txt                      C

Как и у Export-CSV у Import-Csv есть параметры отвечающие за разделители:

 

-Delimiter «Символ разделитель»

Можно указать какой разделитель используется у исходного файла.

Как пример:

$a =  Import-Csv 1.csv -Delimiter ","

 

-UseCulture

Использовать в качестве разделителя символ соответствующий настройкам текущего компьютера

Пример:

$a =  Import-Csv 1.csv -UseCulture

Экспорт и импорт объектов с помощью командлетов Export-Csv и Import-Csv  удобен в некоторых ситуациях. Но этот тип экпорта-импорта не предусматривает наличие вложенных объектов. Данную проблему решают командлеты Export-Clixml и Import-Clixml.

 

 

Import-Clixml

Import-Clixml не имеет ни каких особенных параметров, кроме -Path, В котором надо указывать путь к файлу для импорта.

 

 

Export-Clixml

Так же как и Export-Csv командлет Export-Clixml содержит параметры Path, Encoding, InputObject, Force, NoClobber, Confirm. Они работают точно так же как и в Export-Csv:

 

-Path «путь к файлу»

Задает путь к файлу, в котором будет сохранено XML-представление объекта.

Пример:

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv

 

-Encoding

Задает кодировку целевого файла. Допустимые значения: ASCII, UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, Default и OEM. По умолчанию используется значение UTF8.

Пример:

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Encoding "ASCII"

 

-InputObject

Задает объект, подлежащий преобразованию. Введите переменную, содержащую объекты, либо команду или выражение для получения объектов. Кроме того, можно передать объекты командлету Export-Clixml по конвейеру.

Пример:

PS C:\Temp> Export-Clixml -Path 1.xml -InputObject $a
PS C:\Temp> $a= Import-Clixml .\1.xml
PS C:\Temp> $a


    Каталог: C:\Temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        31.07.2015     16:07      12022 1.csv
-a---        31.07.2015     15:29          7 1.txt
-a---        31.07.2015     15:29          7 1.xml
-a---        31.07.2015     15:29          7 2.csv
-a---        31.07.2015     15:29          7 2.txt
-a---        31.07.2015     15:29          7 2.xml
-a---        31.07.2015     15:29          7 212.txt
-a---        31.07.2015     15:29          7 22.txt
-a---        31.07.2015     15:29          7 3.txt
-a---        31.07.2015     15:29          7 3.xml
-a---        31.07.2015     15:37         42 4.txt
-a---        31.07.2015     15:42         14 5.csv
-a---        31.07.2015     15:39         84 5.txt
-a---        31.07.2015     15:52         42 6.doc
-a---        31.07.2015     15:51         21 6.oth
-a---        31.07.2015     15:47         28 6.txt
-a---        31.07.2015     15:29          7 temp.txt

 

-Force

Указывает командлету снять для файла вывода атрибут «только чтение», если это необходимо.  Когда выполнение команды завершится, командлет попытается заново установить атрибут «только чтение».

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Force

 

-NoClobber

Не позволяет командлету перезаписать содержимое существующего файла. По умолчанию если файл существует по указанному пути, командлет Export-Clixml перезаписывает файл без предупреждения.

Пример ошибки, если файл уже существует:

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -NoClobber
Export-Csv : Файл "C:\Temp\1.csv" уже существует.
строка:1 знак:31
+ Get-ChildItem *.* | Export-Csv <<<<  -Path 1.csv -NoClobber
    + CategoryInfo          : ResourceExists: (C:\Temp\1.csv:String) [Export-Csv], IOException
    + FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.ExportCsvCommand

 

-Confirm

Запрашивает подтверждение перед выполнением команды.

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Confirm

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Export-Csv" над целевым объектом "1.csv".
[Y] Да - Y  [A] Да для всех - A  [N] Нет - N  [L] Нет для всех - L  [S] Приостановить - S  [?] Справка
(значением по умолчанию является "Y"):y
PS C:\Temp>

 

Новый параметр один и называется :

 

-Depth «число уровня вложенности»

Рассмотрим пример:

PS C:\temp> Get-ChildItem C:\Windows\System32\Speech\SpeechUX | Export-Clixml 3.xml -Depth 3
PS C:\temp> $d = Import-Clixml 3.xml

Сделаем импор-экспорт дирректории с 3 уровнем вложенности и сохраним в переменную $d

PS C:\temp> $d


    Каталог: C:\Windows\System32\Speech\SpeechUX


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        12.04.2011     19:26            ru-RU
-a---        14.07.2009      7:38     243200 sapi.cpl
-a---        21.11.2010      9:24    1126912 SpeechUX.dll
-a---        21.11.2010      9:24     418304 speechuxcpl.dll
-a---        14.07.2009      7:41      40448 SpeechUXPS.DLL
-a---        14.07.2009      7:39    4942848 SpeechUXTutorial.exe
-a---        14.07.2009      7:39     628224 SpeechUXWiz.exe
-a---        14.07.2009      7:41     152064 SPTIP.DLL

При этом $d[0] это у нас каталог ru-RU

PS C:\temp> $d[0]


    Каталог: C:\Windows\System32\Speech\SpeechUX


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        12.04.2011     19:26            ru-RU

Посмотрим родительские каталоги его родительских каталогов:

PS C:\temp> $d[0].parent

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        12.04.2011     19:26            SpeechUX


PS C:\temp> $d[0].parent.parent

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        14.07.2009     11:32            Speech


PS C:\temp> $d[0].parent.parent.parent
System32

При этом родительский каталог, родительского каталога имеет тип Deserialized.System.IO.DirectoryInfo

PS C:\temp> $d[0].parent.parent|gm


   TypeName: Deserialized.System.IO.DirectoryInfo

Name              MemberType   Definition
----              ----------   ----------
ToString          Method       string ToString(), string ToString(string format, System.IFormatProvider formatProvider)
BaseName          NoteProperty System.String BaseName=Speech
Mode              NoteProperty System.String Mode=d----
Attributes        Property     System.String {get;set;}
CreationTime      Property     System.DateTime {get;set;}
CreationTimeUtc   Property     System.DateTime {get;set;}
Exists            Property     System.Boolean {get;set;}
Extension         Property     System.String {get;set;}
FullName          Property     System.String {get;set;}
LastAccessTime    Property     System.DateTime {get;set;}
LastAccessTimeUtc Property     System.DateTime {get;set;}
LastWriteTime     Property     System.DateTime {get;set;}
LastWriteTimeUtc  Property     System.DateTime {get;set;}
Name              Property     System.String {get;set;}
Parent            Property     System.String {get;set;}
Root              Property     System.String {get;set;}

А его родительский каталог является уже System.String:

PS C:\temp> $d[0].parent.parent.parent|gm


   TypeName: System.String

Name             MemberType            Definition
----             ----------            ----------
Clone            Method                System.Object Clone()
CompareTo        Method                int CompareTo(System.Object value), int CompareTo(string strB)

 

]]>
https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/feed/ 0
Шпаргалка по С++11 на кружке https://coolcode.ru/shpargalka-po-s-11-na-kruzhke/ https://coolcode.ru/shpargalka-po-s-11-na-kruzhke/#respond Tue, 24 Jun 2014 09:06:52 +0000 http://coolcode.ru/?p=1940

73114e2a47d1307f472996d00a7c270d

Картинка для печати(кликабельно):

C++11_cup_cheatsheet

В шпаргалке содержатся следующие таблицы:

auto
auto p = new T();
auto p = make_shared<T>(arg1);
auto my_lambda= [](){};
auto it = m.begin();
[attr colspan="2"]
standard types
int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_t
raw string literals
string test=R»(C:\A\B\file1.txt)»;
null pointer constant
void foo(char*);
void foo (int);
foo(nullptr);//calls first foo
delegating constructors
class A
{
int a;
public:
A(int x) {a = x;}
A() : A(42){}
A(string s) : A(stoi(s)){}
};
static_assert
template<class T>
void f(T v){
static_assert(sizeof(v) == 4,
#171;#187; «v must have size of 4 bytes»);
}
decltype
int i = 0;
decltype(i) var1;
decltype(2+3) var2;
in-class member initializers
class A
{
int a = 5;
string h = «text1»;
#8230; };
override & final
struct Base
{
vitrual void f(float);
virtual void f2() final;
};
sruct Derived : Base
{
void f(int) override; //error
void f2(); //error
};
lambdas
int a = 42;
count_if(v.begin(), v.end(),
[&a](int x){return x==a;});
std::tuple
tuple<int,float>t(1,2.f);
int x = get<0>(t);
float y = get<1>(t);
enum class
enum class Alert {green, red};
enum class Color:int {red, blue};
Alert a =7; //error
Color c =7; //error
int a2 = red; //error
in a3 = Alert::red; //error
int a4 = blue; //error
int a5 = Color::blue; //error
Color a6 = Color::blue; //ok

Взято с официального блога компании Инфопульс Украина

]]>
https://coolcode.ru/shpargalka-po-s-11-na-kruzhke/feed/ 0
Справочник по C++ https://coolcode.ru/spravochnik-po-c/ https://coolcode.ru/spravochnik-po-c/#comments Tue, 03 Jun 2014 08:14:17 +0000 http://coolcode.ru/?p=1815

Написанное в данной статье  верно для копилятора gcc.

Структура программы:

Необходимый набор в шаблоне прогораммы;

#include <'...'> //заголовок

     Using namespace '...';//пространство имён

int main()                 //обязательные функция main

{

     '...'                 //тело программы

     return 0;

}// конец тела программы

Комментарии в С++:

/* — начало комментария

*/— конец комментария

//— однострочный комментарий

Пример:

/*данная надпись это комментарий*/

//данная надпись это комментарий

 

 

Заголовок программы:

#include <‘имя заголовка’>

(в поздних версиях компилятора #include<‘имя заголовочного файла .h’> устаревший стиль)

Пример:

#include<iostream>//включает в программу заголовок iostream

 

Пространство имени (|):

using namespace ‘название пространства имён’;

Пример:

using namespace std; //Эта инструкция помещает std  в глобальное пространство имён

 

Макросы:

#define ‘имя макроса’ ‘значение макроса’

Пример:

#define SIZE 100 //Связывает идентификатор SIZE со значением 100

 

Таблица типов:

Тип
<code>[attr width="100px"]
Размер
байт
Описание Диапазон
Char
signed char
1 Символьный тип. Содержит один символ или строку символов. Каждый символ представляется одним байтом. Компилятор различет как отдельные следующие типы: char, singned char и unsigned char От 127 до 128
unsigned char 1 Символьный тип. Каждый символ пердставляется одним байтом. От 0 до 255
short
signed short
2 Целый тип. Сокращённое обозначение типа short int. Длина этого типа вне зависимости от используемого компилятора больше или равно длине типа char и меньше или равно типа int. От -32768 до 32767
unsigned short 2 Без знаковый целый тип. От 0 до 65535
int
signed int
4 Целый тип. Длина этого типа вне зависимости от используемого компилятора всегда больше или равна длине значения типа short int. От -2147483648 до 2147483647
unsigned int 4 Без знаковый целый тип. От 0 до 4294967259
long
signed long
4 Целый тип сокращенное обозначение типа long int. От -2147483648 до 2147483647
unsigned long 4 Без знаковый целый тип. От 0 до 4294967259
float 4 Тип данных с плавающей точкой. От 3.4E-38 до 3.4+38
double 8 Тип данных с плавающей точкой двойной точности. Длина типа double вне зависимости от используемого компилятора всегда больше или равна длине float и короче или равна длине типа long double. От 1.7E-308 до 1.7+308
long double 8 Тип данный с плавающей точкой двойной точности, длина которой равна длине значения типа double. Типы double и long double имеют одинаковое представление но компилятор трактует из как различные типы. От 1.7E-308 до 1.7+308
_intn n/8 Целый тип, размер в битах которого определяется значением n; и может быть равным 8, 16, 32 и 64 битам.

Инициализация типов:

‘имя типа’ ‘имя переменной’;

Инициализировать переменную можно в любом месте.

Пример:

int a;//переменная a инициализирована как тип int;

Таблица диапазонов:

Диапазон шестнадцатиричных констант. Диапазон восьмеричных констант Тип.
0x0-0x7FF 0-077777 int
0x8000-0xFFFF 0100000-0177777 unsigned int
0x10000-0x7FFFFFFF 0200000-017777777777 long
0x80000000-0xFFFFFFFF 020000000000-037777777777 unsigneg long

Консольный ввод и вывод:

#include  <iostream>

<<-это оператор вывода.

>>-это оператор ввода.

count <<‘выводимая строка’;

cin >>‘имя переменной’;

Пример:

#include<iostream>
using namespace std;

int main (){
      cin>>n>>k;//Вводится переменные n и k в консоли.

      Count<<'значение перерменной: '<<n;//Выводится строка 'значение переменной: ', а потом данные из переменной n
}

 

printf(‘строка вывода с кодами типов переменных ‘ ,’ссылки на переменные записанные в той же последовательности’)

scanf(‘коды переменных с разделителями’, ‘ссылки на переменные записанные в той же последовательности’)

 

Коды типов:

Код Значение
%d, %i Десятичное знаковое числo.
%o Восьмеричное без знаковое число.
%u Десятичное без знаковое число.
%x, %X Шестнадцатиричное число. x- нижний регистр букв(abcdef), X- верхний регистр букв(ABCDEF).
%f, %F Числа с плавающей запятой.
%e, %E Числа с плавающей запятой в экспоненциальной форме записи (0.1e+13). e- символ «e» в нижнем регистре,  E — символ «E» в верхнем регистре.
%g, %G Числа с плавающей запятой.
%a, %A Число с плавающей запятой в шестнадцатеричном виде.
%c Вывод символа с кодом.
%s Вывод строки с нулевым заершающим байтом.
%S Тоже, что и %s с модицикатором длины l.
%p Вывод указателя.
%n Запись по указателю.
%% Символ для вывода знака процента.

 

Спецификаторы для %d, %i, %o, %u, %x, %X

Спецификатор Тип
отсутсвует int или unsigneg int
l long int или unsigned long int
hh Аргумент int или unsigned int. Приведение к типу signed char или unsigned char.
h Аргумент int или unsigned int.  Приведение к типу short int или unsigned short int.
ll  long long int или unsigned long long int
j intmax_t или uintmax_t
z size_t
t ptrdiff_t
L __int64 или unsigned __int64

 

Унарные опеарации:

Операция Описание
арифметическое отрицание.
~ побитовое логическое отрицание.
! логическое отрицание.
* разадресация (косвенная адресация).
#171;amp;« вычисление адреса.
+ унарный плюс.
++ увеличение.
уменьшение.
sizeof размер

Таблица операций:

Знак операции Операция Группа операций
* Умножение
Мультипликативные<code>[attr rowspan="3"]
/ Деление
% Остаток от деления
+ Сложение
Аддитивные<code><code>[attr rowspan="2"]
Вычитание
#171;lt;<« Сдвиг в лево Операция сдвига
<code>[attr rowspan="2"]
#171;gt;>« Сдвиг в право
#171;lt;« Меньше Операция отношения
<code>[attr rowspan="6"]
#171;gt;« Больше
#171;lt;=« Меньше или равно
#171;gt;=« Больше или равно
== Равно
!= Не равно
#171;amp;« Поразрядное И Поразрядные операции
<code>[attr rowspan="3"]
| Поразрядное ИЛИ
^ Поразрядное исключающее ИЛИ
#171;amp;&« Логическое И Логические операции
<code>[attr rowspan="2"]
|| Логическое ИЛИ
, Последовательное вычисление Последовательные вычисления
= Присваивание Операции присваивания
<code>[attr rowspan="11"]
*= Умножение с присваиванием
/= Деление с присваиваниеме
%= Остаток от деления с присваиванием
-= Вычитание с присваиванием
+= Сложение с присваиванием
#171;lt;<=« Сдвиг в лево с присваиванием
#171;gt;>=« Сдвиг в право с присваиванием
#171;amp;=« Поразрядное И с присваиванием
|= Поразрядное ИЛИ с присваиванием
^= Поразрядное исключающее ИЛИ с присваиванием

Таблица управляющих последовательностей:

Управляющая последовательность Наименования Шеснадцатеричная замена
\a Звонок 007
\b Возврат на шаг 008
\t Горизонтальная табуляция 009
\n Переход на новую строку 00A
\v Вертикальная табуляция 00B
\r Возврат каретки 00C
\f Перевод формата 00D
Кавычки 022
\' Апостроф 027
\0 Ноль-символ 000
#171;\\#187; Обратная дробная черта 05C
\ddd Символ набора кодов ПЭВМ в восьмеричном представлении.
\xddd Символ набота кодов ПЭВМ в шестнадцатеричном представлении.

Функции:

Описание функции:

‘тип данных которые возвращает функция’ ‘имя функции’ (‘переменные которые использует функция’)

{

     операторы;

}

Адресация к функциям:

‘имя функции’(‘переменные которые использует функция’);

Пример:

void init(); //функция init не возвращает переменную оно присваивает глобальной переменной i значение 0

{

     i=0;

}

init();//вызов функции.

Операторы ветвления:

Оператор «if», «else»:

if (‘логическое выражение’) /*если логическое выражение истинно, то выполняется оператор,

                                                          если ложно, то программа выполняется дальше.*/

     ‘оператор’;

if (‘логическое выражение’) /*если логическое выражение истинно, то выполняется оператор1,

                                                           если ложно, то выполняется оператор2.*/

     ‘оператор1’;

else

     ‘оператор2’;

Пример:

if (n!=100) //проверяется условие 'n не равно 100'

     cout<<"n не равно 100 \n";//если условие верно, то выводится строка "n не равно 100"

else

     cout<<"n равно 100 \n"; //если условие не верно, то выводится строка "n равно 100"

 

Оператор «?»:

‘логическое выражение’ ? ‘выражение1’:‘выражение2’;

Если значение логического выражения истинно, то вычисляется выражение1, в противном случае вычисляется выражение2.

Пример:

count << n == 2 ? "да" : "нет"; //если n=2 то в консоль выводится "да" в противном случае "нет"

Оператор «switch»:

switch(‘выражение целого типа’)

{

     case ‘значение1’ :

          ‘последовательность операторов1’

     break;

     case ‘значение2’ :

          ‘последовательность операторов2’

     break;

    

     case ‘значение n’:

          ‘последовательность операторовn’

     break;

     default

          /*ветку default можно не описывать. Она выполняется, если ни один из вышестоящего выражения не удовлетворено*/

          ‘последовательность операторовn+1’;

}

Пример:

switch(n)

{

    case 1: cout<<"один";//если n=1 то выводится строка "один"

    case 2: cout<<"два";//если n=2 то выводится строка "два"

    default : cout<<"не один и не два";//если n равно другому числу, то выводится строка "не один и не два"

}

 

Операторы цикла:

Оператор «while»:

while (‘логическое выражение’) //цикл с проверкой условия на верху

     ‘оператор’;

Пример:

while (n<100) ++n; //Пока n меньше 100 прибавлять 1.

Оператор «do..while»:

do

     оператор;

while (‘логическое выражение’); //Цикл условия проверки внизу

Пример:

do

     n--;

while('n>0'); //Пока n больше нуля повторять процедуру

Оператор «for»:

for(‘инициализация’; ‘проверка’; ‘новое_значение’)

     ‘оператор’;

Пример:

for(i=0; g[i]=0; i++);//В начале i=0 и пока g[i]!=0, к i прибавляется 1 и выполняется пустой оператор ;

Оператор «;»:

; /*Пустой оператор применяется когда синтаксис языка требует присутствие оператора, однако по логике программы оператор должен отсутствовать.*/

Пример:

for(i=0; g[i]=0; i++);//В начале i=0 и пока g[i]!=0, к i прибавляется 1 (оператор после оператора for() не нужен)

Массивы:

Описание массивов:

‘тип данных’ ‘имя массива’ [‘размер массива’];

Адресация к массивам:

‘имя массива’ [‘значение индекса’];

Пример:

int mas[255];//Описывается массив целых чисел mas размер его 255 элементов (первый элемент 0)

mas[5]=0; //6 элементу массива массива mas присваивается значение 0

Константы:

‘тип’ ‘имя константы’ = ‘значение константы’; //Описание константы

Пример:

int a=100,

      c=50; //Описываются две константы a,C. a равна 100, а c равна 50

Классы:

Объявление классов:

class ‘имя класса’{

          ‘закрытые функции и переменные класса’;

     public:

          ‘имя класса’(‘список параметров’); //Конструктор

          ~‘имя класса’();                                    //Деструктор

          ‘открытые функции и переменные класса’;

} ‘список объектов’;

Определение функции-члена:

‘тип возращаемого значения’ ‘имя класса’::‘имя функции’ (‘список параметров’)

{

     ‘тело функции’;

}

Определение конструктора:

‘имя класса’::‘имя класса’ (‘список параметров’)

{

     ‘тело конструктора’;

}

Определение деструктора

‘имя класса’::~‘имя класса’ (‘список параметров’)

{

     ‘тело деструктора’;

}

Объявление класса:

‘имя класса’ ‘имя объекта’(‘список параметров’);

Обращение к членам класса:

‘имя класса’.‘член класса’;

‘имя класса’->‘член класса’;

Пример:

class myclass{                 //Класс с именем myclass

          int a;               //Закрытый элемент класса

     public:

          myclass(int b);      //Конструктор

          void set_a (int num);//Отрытые элементы класса

};

void myclass::set_a(int num)   //определение функции-члена set_a класса myclass

{

     a = num;

}

void myclass::myclass(int b)   //определение конструктора класса myclass

{

     a = b;

}

myclass clas1(4),clas2(2);      //Объявление классов clas1, clas2 типа класса myclass

clas1.set_a(5);                 // Обращение к члену класса

Структуры:

Объявление структур:

struct ‘имя структуры’{

          ‘имя структуры’(‘список параметров’);//Конструктор

          ~‘имя структуры’();                                   //Деструктор

          ‘открытые функции и переменные структуры’;

     private:

          ‘закрытые функции и переменные структуры’;

} ‘список объектов’;

Определение функции-члена, конструктора, деструктора, объявление структуры, обращение к членам структуры такие же как у класса.

Встраиваемые функции:

inline ‘тип возращаемого значения’ ‘имя функции’(‘список параметров’)

{

     ‘тело функции’;

}

Пример:

inline int even(int x)

{

     return !(x%2);

}

Встраиваемые функции в объявлении класса:

Объявление функции:

class

    

     public:

          ‘тип возвращаемого значения’ ‘имя функции’(‘список параметров’){‘тело функции’;}

    

};

Пример:

class samp {

          int i,j;

     public:

          int devisible() {return !(i%j);}  //Встраиваемая функция

};

Дружеские функции:

class ‘имя класса’{

    

     public:

          friend ‘тип возвращаемого значения’ ‘имя функции’(‘список параметров’);

};

‘тип возвращаемого значения’ ‘имя функции’ (‘список параметров’);

{

     ‘тело функции’

}

Пример:

class myclass{

     public:

          friend int istfactor (myclass ob);

};

 

 

]]>
https://coolcode.ru/spravochnik-po-c/feed/ 8
Операторы циклов Паскаль https://coolcode.ru/operatoryi-tsiklov-pascal/ https://coolcode.ru/operatoryi-tsiklov-pascal/#respond Mon, 14 Apr 2014 04:16:36 +0000 http://coolcode.ru/?p=165

В паскале существует 3 оператора цикла это while…do; repeat…until ;  for…to/downto…do; рассмотрим их по подробнее.

while

while оператор повтора, с указанием условий повторения до тела цикла. Поэтому операторы в теле цикла не  выполнятся ни разу, если условие не истинно.

Шаблон данного оператора выглядит следующим образом:

while <Условия продолжения повторений> do

<Тело цикла>;

<Тело цикла> будет выполнятся, пока <Условия продолжения повторений> не станет ложью.

Рассмотрим Следующую задачу: Строку, указанной длины заполнить последовательно цифрами от 0..9.

Код:

program TestWhile;
var
 Len:Integer;
 s,tempS: string;
begin
 Write('Введите длину строки:');
 Readln(len);
 while Length(S)<len do
  begin
    Str(Length(S) mod 10,tempS);
    S:=S+tempS;
 end;
 Writeln(s);
end.

Перед началом цикла мы задаём значения len — длина строки, i мы определяем как 0.

Дальше мы убеждаемся, что i не превышает длину строки len, и выполняем тело цикла заключённого между   begin  и end;, пока i не превышает длину строки len.

Дальше выводим результат.

 

repeat

Так же существует оператор цикла repeat…until; это оператор цикла, с проверкой условия в конце цикла. Она задаётся следующим шаблоном:

repeat

<Оператор 1>;

<Оператор 2>;

<Оператор n>;

until <Условие окончания цикла>;

<Условие окончания цикла> — если это условие станет истинным, то выполнение цикла прекратится.

Заметим, что оператор цикла repeat…until, в отличии от while do выполнится хотя бы один раз. Даже если <Условие окончания цикла> является истинным ещё до начала выполнения цикла.

попытаемся решить предыдущую задачу с помощью этого оператора цикла, напомню условия: «Строку, указанной длины заполнить последовательно цифрами от 0..9.»:

program TestRepeat;
var
 Len,i:Integer;
 s,tempS: string;
begin
  Write('Введите длину строки:');
  Readln(len);
  S:='';
  repeat
    Str(Length(S) mod 10,tempS);
    S:=S+tempS;
  until (Length(S)>=Len);
  Writeln(s);
end.

Перед началом выполениня цикла мы так же задаём значения len — длина строки, i мы определяем как 0.

Выполняем операторы внутри цикла,  проверяем значения выхода из цикла, если длина строки ещё не больше или не равна заданной длины, то повторяем цикл ещё раз.

После выполнения цикла выводим строку на экран.

Эта задача будет работать в большенстве условий, однако если мы зададим длину 0 то цикл выполнится один раз, и вместо строки нулевой длины мы получим строку ‘0’ длиной 1, что явно не соответствует условию задачи.

 

for

Существует ещё один оператор цикла — for.

Этот операто цикла со встроенным счётчиком. Обычно его использование более понятное, чем операторы while и repeat, по крайней мере для меня.

существует два шаблона оператора for:

for <парметры цикла>:=<начальное значение параметра цикла> to <конечное значение параметра цикла> do

<Тело цикла>;

for <парметры цикла>:=<начальное значение параметра цикла> downto <конечное значение параметра цикла> do

<Тело цикла>;

Конструкция for to do- будет увеличивать <парметры цикла> на 1, пока не станет равно конечному значению параметра цикла, после выполнит цикл ещё раз и завершится.

Конструкция же for downto do- будет уменьшать <парметры цикла> на 1, пока не станет равным конечное значение параметра цикла, потом выполнит цикл ещё раз и завершится.

Для закрепления попытаемся решить предыдущую задачу с помощью данного оператора повтора. » Строку, указанной длины заполнить последовательно цифрами от 0..9.»:

program TestFor;
uses
  SysUtils;
  var
    Len:Integer;
    s,tempS: string;
    i: Integer;
begin
  Write('Введите длину строки:');
  Readln(len);
  S:='';
  for i:=0 to Len-1 do
  begin
    Str(i mod 10,tempS);
    S:=S+tempS;
  end;
  Writeln(s);
end.

Обратите внимание, что в условии цикла for мне пришлось из Len вычесть 1,т.к. цикл выполняется ещё раз после достижения результата. Так же нам пришлось объявить ещё одну переменную i.

 

Break

Иногда хочется выйти из цикла в середине его выполнения, для этого существует оператор Break. При его вызове программа выходит из текущего цикла.

Рассмотрим первое решение задачи с помощью параметра while. В том примере, мы не учитываем, что длина строки в Pasсal не может привышать 254 символа. Обработаем данную ошибку:

program TestBreak;
var
 Len:Integer;
 s,tempS: string;
begin
 Write('Введите длину строки:');
 Readln(len);
 while Length(S)<len do
  begin
    Str(Length(S) mod 10,tempS);
    S:=S+tempS;
    if  Length(S)>=254 then Break;
  end;
 Writeln(s);
 readln;
end.

Мы вставили строку:

if  Length(S)>=254 then Break;

Теперь если длина строки будет равна или превышать 254, то мы выйдем из цикла и выведем полученное значение.

Однако не стоит злоупотреблять оператором Break он может существенно снизить читаемость кода. И обычно без него возможно обойтись, так например предыдущий код мог выглядеть так:

program NotBreak;
var
 Len:Integer;
 s,tempS: string;
begin
 Write('Введите длину строки:');
 Readln(len);
 while (Length(S)<len) and (Length(S)<=254) do
  begin
    Str(Length(S) mod 10,tempS);
    S:=S+tempS;
  end;
 Writeln(s);
end.

 

]]>
https://coolcode.ru/operatoryi-tsiklov-pascal/feed/ 0