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-File
está em execução, outro aplicativo pode ler o arquivo de log.
Enquanto Set-Content
estiver 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-File
salva na codificação Unicode
( UTF-16LE
) por padrão (embora isso possa ser especificado), enquanto o Set-Content
padrão é ASCII
( US-ASCII
) no PowerShell 3+ (isso também pode ser especificado). Em versões anteriores do PowerShell, Set-Content
escrevia conteúdo na Default
codificação (ANSI).
Nota do editor : o PowerShell a partir da versão 5.1 ainda é padronizado para a Default
codificaçã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-File
salva a formatação extravagante da saída, conforme visto no terminal. Portanto, em uma pasta com dois arquivos, o comando dir | out-file out.txt
cria um arquivo com 11 linhas.
Considerando que Set-Content
salva uma representação mais simples. Nessa pasta com dois arquivos, o comando dir | set-content sc.txt
cria 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-Content
não cria de maneira confiável um arquivo vazio quando Out-File
:
Em uma pasta vazia, o comando dir | out-file out.txt
cria um arquivo, enquanto dir | set-content sc.txt
não.
Variável de pipeline
Set-Content
pega o nome do arquivo do pipeline; permitindo que você defina um número de conteúdo de arquivos para algum valor fixo.
Out-File
pega 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-Content
codificaçã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).Out-File
tem problemas com filas longas em certas situações. Por exemplo:$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
tem o comportamento de sobrescrever o caminho de saída, a menos que o-NoClobber
e / ou o-Append
sinalizador seja definido.Add-Content
acrescentará conteúdo se o caminho de saída já existir por padrão (se puder). Ambos criarão o arquivo, se ainda não houver um.Outra diferença interessante é que
Add-Content
criará um arquivo codificado em ASCII por padrão eOut-File
criará um pequeno arquivo codificado em unicode endian por padrão.>
éum alias deaçúcar sintático paraOut-File
. ÉOut-File
com algumas configurações de parâmetros predefinidos.fonte
echo "" > $null | Add-Content abc.txt
isso não criará o arquivoabc.txt
, mas Out-File faria.Add-Content
, não recebe nada. SeAdd-Content
não recebe nada, por que deveria criar um arquivo? Por outro lado, a mesma pergunta poderia ser feita para Out-File.gci $folder | Out-File log.txt ; cat log.txt
funciona enquantogci $folder | Add-Content log.txt ; cat log.txt
explodeSet-Content
está sendo usado, o arquivo fica indisponível para outros aplicativos.Bem, eu discordo ... :)
tão:
e
lhe dará resultados totalmente diferentes.
E não, '>' não é um alias, é um operador de redirecionamento (o mesmo que em outros shells). E tem limitação muito séria ... Vai cortar as linhas da mesma forma que são exibidas. Out-File tem o parâmetro -Width que ajuda a evitar isso. Além disso, com os operadores de redirecionamento, você não pode decidir qual codificação usar.
HTH Bartek
fonte
>
e Out-File são a mesma coisa. Eles chamam o mesmo código. Do PowerShell em ação, segunda edição de Bruce Payette (Kindle Locations 4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
>
não é o equivalente exatoout-file
. Se você definir$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, ele será ignorado por>
.Set-Content
suporta-Encoding Byte
, enquantoOut-File
não.Portanto, quando quiser gravar dados binários ou resultados
Text.Encoding#GetBytes()
em um arquivo, você deve usarSet-Content
.fonte
Out-file -append ou ">>" pode, na verdade, misturar duas codificações no mesmo arquivo. Mesmo se o arquivo for originalmente ascii ou ansi, ele adicionará unicode por padrão ao final dele. Add-content irá verificar a codificação e combiná-la antes de anexar. A propósito, export-csv padroniza para ascii (sem acentos), e set-content / add-content para ansi.
fonte