Selama bertahun-tahun, saya telah menggunakan cmd/DOS/Windows
shell dan berlalu argumen baris perintah ke file batch. Sebagai contoh, saya memiliki sebuah file, zuzu.bat
dan dalam hal ini, saya akses%1
, %2
, dll. Sekarang, saya ingin melakukan hal yang sama ketika saya sebut PowerShell
script ketika saya di Cmd.exe shell
. Saya punya script, xuxu.ps1
(dan I've menambahkan PS1 untuk saya PATHEXT variabel dan terkait PS1 file dengan PowerShell). Tapi tidak peduli apa yang saya lakukan, saya tidak mendapatkan apa-apa dari $args
variabel. Itu selalu memiliki suhu udara turun menjadi 0.
Jika aku dalam PowerShell
shell, bukannya cmd.exe
, ia bekerja (tentu saja). Tapi aku'm belum cukup nyaman untuk tinggal di lingkungan PowerShell penuh waktu. Saya don't ingin mengetik powershell.exe -perintah xuxu.ps1 p1 p2 p3 p4
. Saya ingin mengetik xuxu p1 p2 p3 p4
.
Ini mungkin, dan jika demikian, bagaimana?
Sampel yang saya tidak bisa mendapatkan pekerjaan 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>
Artikel ini membantu. Secara khusus, bagian ini:
-File
Menjalankan script tertentu dalam lingkup lokal ("dot-bersumber"), sehingga fungsi-fungsi dan variabel yang naskah menciptakan tersedia dalam sesi saat ini. Masukkan script path file dan parameter apapun. File harus menjadi yang terakhir parameter dalam perintah, karena semua karakter yang diketik setelah File parameter nama ditafsirkan sebagai file script path diikuti oleh script parameter.
yaitu
powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3
cara menjalankan file myfile.ps1 dan arg1 arg2 & arg3 adalah parameter untuk PowerShell script.
OK, jadi pertama ini adalah melanggar dasar fitur keamanan di PowerShell. Dengan pemahaman itu, di sini adalah bagaimana anda bisa melakukannya:
Anda mungkin ingin menempatkan -NoProfile
argumen di sana juga tergantung pada apa yang anda profil.
Setelah menggali melalui PowerShell dokumentasi, saya menemukan beberapa informasi yang berguna tentang masalah ini. Anda dapat't menggunakan $args
jika anda menggunakan param(...)
di awal file anda; sebagai gantinya, anda akan perlu menggunakan $PSBoundParameters
. Saya copy/paste kode anda ke script PowerShell, dan bekerja seperti yang anda'd harapkan dalam versi PowerShell 2 (saya tidak yakin apa versi anda pada saat anda berlari ke dalam masalah ini).
Jika anda menggunakan $PSBoundParameters
(dan ini HANYA bekerja jika anda menggunakan param(...)
di awal script anda), maka tidak array, itu adalah sebuah tabel hash, sehingga anda akan perlu untuk referensi 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 disebut dengan...
PS> ./foo.ps1 a b c d
Hasilnya adalah...
Num Args: 4
$p1=a $p2=b $p3=c $p4=d
Mungkin anda bisa membungkus PowerShell doa dalam .bat
file seperti:
rem ps.bat
@echo off
powershell.exe -command "%*"
Jika anda kemudian ditempatkan berkas ini di bawah folder di JALAN
, anda bisa menelepon PowerShell script seperti ini:
ps foo 1 2 3
Mengutip bisa mendapatkan sedikit berantakan, meskipun:
ps write-host """hello from cmd!""" -foregroundcolor green
Anda mungkin tidak mendapatkan "xuxu p1 p2 p3 p4" karena tampaknya. Tetapi ketika anda berada di PowerShell dan anda set
PS > set-executionpolicy Unrestricted -scope currentuser
Anda dapat menjalankan script tersebut seperti ini:
./xuxu p1 p2 p3 p4
atau
.\xuxu p1 p2 p3 p4
atau
./xuxu.ps1 p1 p2 p3 p4
Saya berharap itu membuat anda sedikit lebih nyaman dengan PowerShell.
jika anda ingin memanggil ps1 script dari cmd dan melewati argumen tanpa melibatkan script seperti
powershell.exe script.ps1 -c test
script -c test ( wont work )
anda dapat melakukan berikut ini
setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*
Ini adalah asumsi powershell.exe di jalan anda
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype