Script básico do Powershell

Script básico do Powershell

Estou tentando aprender um pouco sobre os scripts do PowerShell e tentando dividir logicamente um script que inclui esse trecho.

$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }

Se eu estivesse escrevendo isso do zero, acho que escreveria da seguinte maneira - por que estou errado?

$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }

Roteiro Completo: - observe que $destfilename não está definido, possivelmente com erro (?)

$path = "C:\a\" 
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\" 

while(!(Test-Path $fileexisting)) {Start-Sleep 5} 

$destfolders | 
    ForEach-Object {Copy-Item -Path $path\$filename -dest (Join-Path $_ $destfilename)} 

Responder1

Esta linha contém elementos, como $destFolders, $Sourcee $destFileName, que aparentemente fazem parte de um script completo. Sem conhecê-los e seu propósito, minha resposta poderia estar errada.

No entanto, oCopiar ItemO comando tem a capacidade de copiar um item e renomeá-lo também. Parece que é exatamente isso que a primeira linha do script está fazendo. Sua linha apenas copia o item.

Responder2

Brevemente: Join-Pathpermite manter a estrutura de pastas, desde que $destFileNamecontenha informações de diretório e arquivo. (ou seja, parece algo como "somedirectory\myfile.txt", não myfile.txt)

Portanto, o script está copiando arquivos da C:\unidade para E:\e D:\.

Imagine que existe um arquivo C:\myfile.txt:

Copiar usando os dois trechos produz o mesmo resultado: seu trecho diz "copiar de c:\ para d:\ e e:\ Não estou fazendo nada com os nomes dos arquivos, então apenas mantenha-os iguais", o outro trecho diz "copiar de c:\ para d:\myfile.txt e e:\myfile.txt Estou informando explicitamente os nomes dos arquivos"

Imagine que você tem um arquivoC:\somedirectory\myfile.txt

Agora há uma diferença, pois $_copiará de novo D:\myfile.txte E:\myfile.txtde novo. Ele irá ignorar o fato de o arquivo estar contido em um diretório. Usar Join-path $_ $destFileNamesignificará que o arquivo será copiado para D:\somedirectory\myfile.txtand E:\somedirectory\myfile.txt

Responder3

Você pode ver uma barra invertida dupla C:\a\\a6ile0309.PxP(pequeno erro) e caracteres supostamente indesejados na saída original (erro grave):

a6ile0309.PxP
 ↑        ↑ ↑
 ↓        ↓ ↓
afile0309.txt

Este último é causado por especificadores de formato mal utilizados fet

(get-date).AddDays(-4).ToString('afileMMdd.txt')
#                                 ↑        ↑ ↑

LerFormatando datas e horaseFormatando números e datas usando o objeto CultureInfo:

  • fData e hora completas (data longa e hora curta)
  • t,%t O primeiro caractere no designador AM/PMdefinido em AMDesignator ou PMDesignator, se houver. Especifique "%t" se o padrão de formato não for combinado com outros padrões de formato.

Na verdade, fnos afileresultados até o último milissegundo(?) ou tick(?), veja a última nota abaixo. Honestamente, não sei se é possível escapar, então tente o seguinte trecho de código:

'--- original ---'
$path = "C:\a\" 
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\" 
Write-host $filename, $fileexisting -ForegroundColor Yellow

### next WHILE never ends
### while(!(Test-Path $fileexisting)) {Start-Sleep 5} 

'--- use rather ---'
$path = "C:\a\" 
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
$fileexisting = Join-Path $path $filename
$destfolders = "C:\b\", "C:\c\" 
Write-host $filename, $fileexisting

Saída:

PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt

Observeque

$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'

poderia ser escrito como

$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'

e não sei qual notação é melhor ou mais correta (PowerShell).

Observe tambéma diferença:

PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.ffffff")  # six f
2017-03-13-22.23.35.897305

PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.fffffff") # seven f
2017-03-13-22.30.08.4030682

PS D:\PShell> (get-date).ToString("f")
13 March 2017 22:23

PS D:\PShell> (get-date).ToString("ff")
20

informação relacionada