Aqui está um resumo do que deduzi, após alguns meses de experiência com o PowerShell e alguns experimentos científicos. Nunca encontrei nada disso na documentação :(
[ Atualização: muito disso agora parece estar melhor documentado.]
Bloqueio de leitura e gravação
Enquanto Out-Fileestá em execução, outro aplicativo pode ler o arquivo de log.
Enquanto Set-Contentestiver em execução, outros aplicativos não podem ler o arquivo de log. Portanto, nunca useSet-Content para registrar comandos de longa duração.
Codificação
Out-Filesalva na codificação Unicode( UTF-16LE) por padrão (embora isso possa ser especificado), enquanto o Set-Contentpadrão é ASCII( US-ASCII) no PowerShell 3+ (isso também pode ser especificado). Em versões anteriores do PowerShell, Set-Contentescrevia conteúdo na Defaultcodificação (ANSI).
Nota do editor : o PowerShell a partir da versão 5.1 ainda é padronizado para a Defaultcodificação específica da cultura ("ANSI"), apesar do que a documentação afirma. Se ASCII fosse o padrão, caracteres não ASCII, como üseriam convertidos em literais ? , mas esse não é o caso: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'rendimentos $False.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Isso significa que os padrões de dois comandos são incompatíveis e misturá-los irá corromper o texto, portanto, sempre especifique uma codificação.
Formatação
Como Bartek explicou, Out-Filesalva a formatação extravagante da saída, conforme visto no terminal. Portanto, em uma pasta com dois arquivos, o comando dir | out-file out.txtcria um arquivo com 11 linhas.
Considerando que Set-Contentsalva uma representação mais simples. Nessa pasta com dois arquivos, o comando dir | set-content sc.txtcria um arquivo com duas linhas. Para emular a saída no terminal:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Acredito que essa formatação tenha consequências para quebras de linha, mas ainda não consigo descrevê-la.
Criação de arquivo
Set-Contentnão cria de maneira confiável um arquivo vazio quando Out-File:
Em uma pasta vazia, o comando dir | out-file out.txtcria um arquivo, enquanto dir | set-content sc.txtnão.
Variável de pipeline
Set-Contentpega o nome do arquivo do pipeline; permitindo que você defina um número de conteúdo de arquivos para algum valor fixo.
Out-Filepega os dados a partir do pipeline; atualizar o conteúdo de um único arquivo.
Parâmetros
Set-Content inclui os seguintes parâmetros adicionais:
- Excluir
- Filtro
- Incluir
- Passar através
- Corrente
- UseTransaction
Out-File inclui os seguintes parâmetros adicionais:
- Acrescentar
- NoClobber
- Largura
Para obter mais informações sobre o que são esses parâmetros, consulte a ajuda; por exemplo get-help out-file -parameter append.
Set-Contentcodificação padrão: traduzido para(Get-Culture).Textinfo.ANSICodePage(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ, CurrentUICultureen-GB, ANSICodePage1250, OEMCodePage852, testado usando'řž'string com códigos diferentes nas páginas de código acima).