10 Mart 2020 Salı

Powershell Copy-Item - Dosyayı Kopyalar

Giriş
Uzak bilgisayara Copy-Item kullanırken hedef yolur belirtmek için iki yöntem var. Farklarını bilmiyorum

1. New-PSDrive 
New-PSDrive ile yeni bir sadece PowerShell'de görülen drive yaratmak ve buraya kopyalamak

Örnek
Şöyle yaparız. "\\machine1\abc\123\log 1.zip" dosyası diğer makinedeki "\\machine2\\c$\Logs\" dizinine kopyalanır. PSDrive isimleri olarak source ve target kullanılıyor.
New-PSDrive -Name source -PSProvider FileSystem -Root \\machine1\abc\123 | Out-Null
New-PSDrive -Name target -PSProvider FileSystem -Root \\machine2\c$\Logs | Out-Null
Copy-Item -Path source:\log_1.zip -Destination target:
Remove-PSDrive source
Remove-PSDrive target
Örnek - Farklı Domain'lerdeki Bilgisayarlar İçin
New-PSDrive komutuna -Credential seçeneği ile kullanıcı adı + şifre bilgisini geçmek gerekiyor.
Şöyle yaparız.
$password = Get-Content E:\Scripts\password.txt | ConvertTo-SecureString
$credentials = New-Object -typename System.Management.Automation.PSCredential
  -argumentlist "domain\username",$pass


New-PSDrive -Name Z -PSProvider filesystem -Root "\10.15.2.5\Baseline$"
  -Credential $creds

Remove-Item -Path Z:\ -filter *.bak
Copy-Item -filter *.bak E:\Backup -Destination Z:\ -ErrorAction SilentlyContinue
  -ErrorVariable A

Remove-PSDrive Z
Şöyle yaparız.
$username = "myuser"
$password = "mypassword"
$secureString = ConvertTo-SecureString $password -ASPlainText -Force


$credentials = New-Object System.Management.Automation.PSCredentials($username,
  $secureString)

$remoteSession = New-PSSession $computer -Credential $credentials


$psDriveName = "Driveabc"

New-PSDrive -Name $psDriveName -PSProvider FileSystem -Root 
  "\\mycomputer\\MySharedFolder" -Credential $credentials


Copy-Item ....

Remove-PSDrive $psDriveName
Remove PSSession -Session $remoteSession
2. SMB ile kopyalama yapmak
Şöyle yaparız
Copy-Item \\servername1\sharename1\filename.ext \\servername2\sharename2
Sonuç Değeri
Bu komutu şöyle kullanmak yanlış.
if (Copy-Item .\test.ps1 $env:SystemRoot\System32)
{
    Write-Host "Done."
    exit 0
}
else
{
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}
Açıklaması şöyle.
Copy-Item does not return anything by default, that's why your if statement is always false, because [bool]$null is $false.

Şöyle yaparız. Burada $? değişkenini kullanıyoruz.
Copy-Item .\test.ps1 $env:SystemRoot\System32
if ($?) {
    Write-Host "Done."
    exit 0
} 
else {
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}
-Destinaton seçeneği - Hedef Dosya Dizin
-Path  ile source dosya/dizin belirtilir. -Destination ile target dosya/dizin belirtilir
Örnek
Şöyle yaparız.
$TimeStamp = get-date -f yyyyMMddhhmm
$Destination = "\\netshare\DESTINATION\DATA_" + $TimeStamp
New-Item -ItemType directory -Path $Destination -Force
Copy-Item -Path $Source\*.* -Destination $Destination -Force
-ErrorAction seçeneği
Komutu try/Catch içinde kullanabilmeyi sağlar.
Örnek
Şöyle yaparız.
Try {
    Copy-Item .\test.ps1 $env:SystemRoot\System32 -ErrorAction Stop
    Write-Host "Done."
    exit 0
}
Catch {
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}
-PassThru seçeneği
Komutun başarılı olup olmadığına dair bir sonuç dönmesini sağlar.
Örnek
Şöyle yaparız.
if (Copy-Item .\test.ps1 $env:SystemRoot\System32 -PassThru)

Hiç yorum yok:

Yorum Gönder