Pertanyaan Cara meneruskan argumen baris perintah ke file ps1 PowerShell


Selama bertahun-tahun, saya telah menggunakan cmd/DOS/Windows shell dan melewati argumen command-line ke file batch. Sebagai contoh, saya punya file, zuzu.bat dan di dalamnya, saya akses %1, %2, dll. Sekarang, saya ingin melakukan hal yang sama ketika saya memanggil PowerShell naskah when I am in a Cmd.exe shell. Saya punya skrip, xuxu.ps1 (dan saya telah menambahkan PS1 ke variabel PATHEXT saya dan file PS1 terkait dengan PowerShell). Tapi tidak peduli apa yang saya lakukan, saya sepertinya tidak bisa mendapatkan apa-apa dari $args variabel. Selalu memiliki panjang 0.

Jika saya di PowerShell shell, bukan cmd.exe, itu berhasil (tentu saja). Tapi saya belum cukup nyaman untuk hidup di lingkungan PowerShell sepanjang waktu. Saya tidak ingin mengetik powershell.exe -command xuxu.ps1 p1 p2 p3 p4. Saya ingin mengetik xuxu p1 p2 p3 p4.

Apakah ini mungkin dan jika iya, bagaimana?

Sampel yang saya tidak dapat bekerja adalah hal yang sepele, foo.ps1:

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
    Write-Host "Arg: $arg";
}

Hasilnya selalu seperti ini:

C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>

76
2017-08-18 13:37


asal


Jawaban:


Artikel ini membantu. Secara khusus, bagian ini:

-Mengajukan

Menjalankan skrip yang ditentukan dalam lingkup lokal ("dot-sourced"), sehingga fungsi dan variabel yang dibuat skrip tersedia di sesi saat ini. Masukkan path file skrip dan parameter apa pun. File harus menjadi parameter terakhir dalam perintah, karena semua karakter yang diketik setelah nama parameter File ditafsirkan sebagai jalur file skrip diikuti oleh parameter skrip.

yaitu

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

berarti menjalankan file myfile.ps1 dan arg1 arg2 & arg3 adalah parameter untuk skrip PowerShell.


27
2018-03-28 00:35



OK, jadi pertama ini adalah memecah fitur keamanan dasar di PowerShell. Dengan pemahaman itu, di sini adalah bagaimana Anda dapat melakukannya:

  1. Buka sebuah Windows Explorer jendela
  2. Menu Alat-alat -> Pilihan folder -> tab Jenis File
  3. Temukan jenis file PS1 dan klik tombol lanjutan
  4. Klik tombol Baru
  5. Untuk Aksi: Buka
  6. Untuk Aplikasi yang dimasukkan: "C: \ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"% *

Anda mungkin ingin meletakkan -NoProfile argumen di sana juga tergantung pada apa yang dilakukan profil Anda.


16
2017-08-18 14:10



Setelah menggali melalui dokumentasi PowerShell, saya menemukan beberapa informasi yang berguna tentang masalah ini. Anda tidak bisa menggunakan $args jika Anda menggunakan param(...) di awal file Anda; alih-alih Anda perlu menggunakannya $PSBoundParameters. Saya salin / sisipkan kode Anda ke dalam skrip PowerShell, dan itu berfungsi seperti yang Anda harapkan di PowerShell versi 2 (Saya tidak yakin versi apa yang Anda gunakan saat Anda mengalami masalah ini).

Jika Anda menggunakan $PSBoundParameters (dan ini HANYA berfungsi jika Anda menggunakan param(...) di awal skrip Anda), maka itu bukan sebuah array, itu adalah tabel hash, jadi Anda perlu merujuknya menggunakan pasangan kunci / nilai.

param($p1, $p2, $p3, $p4)
$Script:args=""
write-host "Num Args: " $PSBoundParameters.Keys.Count
foreach ($key in $PSBoundParameters.keys) {
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + "  "
}
write-host $Script:args

Dan ketika dipanggil dengan ...

PS> ./foo.ps1 a b c d

Hasilnya adalah...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d

13
2017-07-25 21:24



Deklarasikan parameter Anda dalam file, seperti param ([string] $ para1 ....... [string] $ param2).

Sekarang panggil file PowerShell seperti temp.ps1 para1 para2....para10, dll.


8
2017-08-24 11:41



Mungkin Anda bisa membungkus pemanggilan PowerShell di a .batfile seperti ini:

rem ps.bat
@echo off
powershell.exe -command "%*"

Jika Anda kemudian menempatkan file ini di bawah folder di Anda PATH, Anda bisa memanggil skrip PowerShell seperti ini:

ps foo 1 2 3

Mengutip bisa menjadi sedikit berantakan, meskipun:

ps write-host """hello from cmd!""" -foregroundcolor green

6
2018-01-21 00:19



Anda mungkin tidak mendapatkan "xuxu p1 p2 p3 p4" seperti yang terlihat. Tetapi ketika Anda berada di PowerShell dan Anda mengatur

PS > set-executionpolicy Unrestricted -scope currentuser

Anda dapat menjalankan skrip-skrip seperti ini:

./xuxu p1 p2 p3 p4

atau

.\xuxu p1 p2 p3 p4

atau

./xuxu.ps1 p1 p2 p3 p4

Saya harap itu membuat Anda sedikit lebih nyaman dengan PowerShell.


1
2018-05-27 18:41