Script básico do Powershell [fechado]

0

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

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

Se eu estivesse escrevendo isso do zero, acho que escreveria assim: por que estou errado?

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

Script completo: - por favor, note 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)} 
    
por Spider Monkey 12.03.2017 / 11:34

3 respostas

2

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

No entanto, o comando Copy-Item tem a capacidade de copie um item e renomeie-o também. Parece que é exatamente isso que a primeira linha de script está fazendo. Sua linha apenas copia o item.

    
por 12.03.2017 / 12:02
2

Resumidamente : Join-Path permite manter a estrutura de pastas, desde que $destFileName contenha informações de diretórios e arquivos. (ou seja, parece algo como "somedirectory\myfile.txt" , não myfile.txt )

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

Imagine um arquivo C:\myfile.txt exists:

Copying using both snippets yields the same result: your snippet says "copy from c:\ to d:\ and e:\ I'm not doing anything with the filenames so just keep them the same", the other snippet says "copy from c:\ to d:\myfile.txt and e:\myfile.txt. I am explicitly telling you the filenames"

Imagine que você tenha um arquivo C:\somedirectory\myfile.txt

Now there's a difference as $_ will copy to D:\myfile.txt and E:\myfile.txt again. It will ignore the fact the the file was contained inside a directory. Using Join-path $_ $destFileName will mean the file is copied to D:\somedirectory\myfile.txtand E:\somedirectory\myfile.txt

    
por 12.03.2017 / 15:32
0

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

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

O último é causado por especificadores de formato usados incorretamente f e t

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

Leia Como formatar datas e horários e Formatando números e datas usando o objeto CultureInfo :

  • f Data e hora completas (data longa e tempo curto)
  • t , %t O primeiro caractere no designador AM / PM definido no AMDesignator ou PMDesignator, se houver. Especifique "% t" se o padrão de formato não for combinado com outros padrões de formato.

De fato, f in afile resulta no último milissegundo (?) ou tick (?), veja a última nota abaixo. Honestamente, não sei se é possível escapar. 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\SU87865.ps1
--- original ---
a6ile0309.PxP C:\a\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt

Por favor, note que

$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 eu não sei qual notação é melhor ou mais correta ( PowerShellish ).

Observe também a 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
    
por 13.03.2017 / 22:01

Tags