Script Powershell dasar [ditutup]

0

Saya mencoba belajar sedikit tentang skrip PowerShell dan telah mencoba untuk secara logis memecah skrip yang menyertakan potongan ini.

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

Jika saya menulis ini dari awal saya pikir saya akan menulisnya sebagai berikut - mengapa saya salah?

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

Skrip Lengkap: - harap dicatat $ destfilename tidak didefinisikan, mungkin karena kesalahan (?)

$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)} 
Monyet laba-laba
sumber
1
Anda harus memasukkan skrip yang lengkap jika Anda mengharapkan jawaban yang tepat. Harap edit pertanyaan.
DavidPostill
Selamat datang di Pengguna Super. Silahkan mengambil 2 menit tour . Selain itu, buka pusat Bantuan dan baca setidaknya Cara Mengajukan Pertanyaan . Meskipun pertanyaan Anda harus ditanyakan di stackoverflow.com, itu bisa dijawab di sini jika Anda mengedit pertanyaan Anda dan memberikan contoh Minimal, Lengkap, dan dapat diverifikasi
JosefZ

Jawaban:

1

Baris ini berisi elemen, seperti $destFolders, $Sourcedan $destFileName, yang tampaknya merupakan bagian dari skrip lengkap. Tanpa mengetahui mereka dan tujuan mereka, jawaban saya bisa salah.

Namun, perintah Salin-Item memiliki kemampuan untuk menyalin item dan menamainya juga. Sepertinya inilah yang dilakukan oleh baris pertama skrip. Baris Anda hanya menyalin item.


sumber
Terima kasih atas tanggapannya di sini adalah naskah lengkapnya. $ DestFileName yang membingungkan saya. $ path = "C: \" $ filename = "myfile.txt" $ destfolders = "D: \", "E: \" while (! (Jalur-Tes $ path / $ nama file)) {Mulai-Tidur 5} $ destfolders | ForEach-Object {Copy-Item -Path $ path \ $ filename -dest (Bergabung-Path $ _ $ destfilename)}
Spider Monkey
Hmm ... Aneh. Dalam skrip ini, baris yang Anda berikan berbeda dan tidak ada variabel $ destfilename. Apa yang kita lewatkan?
1
$ Path / $ nama file menghasilkan kesalahan divisi. Dan $ path \ $ nama file menghasilkan kesalahan token. Segala sesuatu dalam "naskah lengkap" ini salah.
1

Secara singkat : Join-Pathmemungkinkan Anda untuk mempertahankan struktur folder yang $destFileNameberisi informasi direktori dan file. (Yaitu terlihat seperti "somedirectory\myfile.txt", tidak myfile.txt)

Jadi skripnya menyalin file dari C:\drive ke E:\dan D:\.

Bayangkan C:\myfile.txtada file :

Menyalin menggunakan kedua snippet menghasilkan hasil yang sama: snippet Anda mengatakan "salin dari c: \ ke d: \ dan e: \ Saya tidak melakukan apa pun dengan nama file jadi tetap sama saja," kata potongan lainnya "salin dari c: \ to d: \ myfile.txt dan e: \ myfile.txt. Saya secara eksplisit memberi tahu Anda nama file "

Bayangkan Anda memiliki file C:\somedirectory\myfile.txt

Sekarang ada perbedaan karena $_akan menyalin ke D:\myfile.txtdan E:\myfile.txtlagi. Itu akan mengabaikan fakta file itu terkandung di dalam direktori. Menggunakan Join-path $_ $destFileNameberarti file disalin ke D: \ somedirectory \ myfile.txtand E:\somedirectory\myfile.txt

gms0ulman
sumber
0

Anda dapat melihat backslash berlipat ganda dalam C:\a\\a6ile0309.PxP(kesalahan kecil) dan karakter yang seharusnya tidak diinginkan dalam output asli (kesalahan parah):

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

Yang terakhir ini disebabkan oleh penspesifikasi format yang disalahgunakan fdant

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

Baca Memformat Tanggal dan Waktu serta Memformat Angka dan Tanggal Menggunakan Objek CultureInfo :

  • f Tanggal dan waktu penuh (tanggal panjang dan waktu singkat)
  • t, %t Karakter pertama dalam penunjuk AM / PM yang ditentukan dalam AMDesignator atau PMDesignator, jika ada. Tentukan "% t" jika pola format tidak digabungkan dengan pola format lainnya.

Bahkan, fdalam afilehasil untuk bertahan milidetik (?) Atau centang (?), Lihat catatan terakhir di bawah ini. Jujur, saya tidak tahu apakah itu bisa lolos jadi coba cuplikan kode berikut:

'--- 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

Keluaran :

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

Harap perhatikan itu

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

dapat ditulis sebagai

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

dan saya tidak tahu notasi mana yang lebih baik atau lebih benar ( PowerShellish ).

Perhatikan juga perbedaannya:

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
JosefZ
sumber