Selama bertahun-tahun, saya telah menggunakan cmd/DOS/Windows
shell dan memberikan argumen baris perintah ke file batch. Sebagai contoh, saya memiliki sebuah file, zuzu.bat
dan di dalamnya, akses saya %1
, %2
, dll Sekarang, saya ingin melakukan hal yang sama ketika saya sebut PowerShell
naskah when I am in a Cmd.exe shell
. Saya memiliki skrip, xuxu.ps1
(dan saya telah menambahkan PS1 ke variabel PATHEXT saya dan file PS1 terkait dengan PowerShell). Tapi apa pun yang saya lakukan, saya sepertinya tidak bisa mendapatkan apa pun dari $args
variabel. Itu selalu memiliki panjang 0.
Jika saya berada di PowerShell
shell, bukannya cmd.exe
, itu berfungsi (tentu saja). Tapi saya belum cukup nyaman untuk hidup di lingkungan PowerShell secara penuh. 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 bisa mulai bekerja itu 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>
sumber
xuxu p1 p2 p3 p4
").Setelah menggali dokumentasi PowerShell, saya menemukan beberapa informasi berguna tentang masalah ini. Anda tidak dapat menggunakan
$args
jika Anda menggunakanparam(...)
di awal file Anda; sebagai gantinya, Anda harus menggunakan$PSBoundParameters
. Saya menyalin / menempelkan kode Anda ke dalam skrip PowerShell, dan berfungsi seperti yang Anda harapkan di PowerShell versi 2 (Saya tidak yakin versi apa yang Anda gunakan saat mengalami masalah ini).Jika Anda menggunakan
$PSBoundParameters
(dan ini HANYA berfungsi jika Anda menggunakanparam(...)
di awal skrip Anda), maka itu bukan array, ini adalah tabel hash, jadi Anda perlu mereferensikannya 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 saat dipanggil dengan ...
Hasilnya adalah...
Num Args: 4 $p1=a $p2=b $p3=c $p4=d
sumber
pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
itu, sebenarnya tidak seperti itu. Di sisi lain, jika saya menggunakan PowerShell dan melakukannya.\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
, itu berfungsi seperti yang saya harapkan. Saya pernah mendengar bahwa ini dimaksudkan untuk berfungsi karena "alasan keamanan."Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4
hasil:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
param
merupakan konstruksi bahasa, namun itu harus menjadi hal pertama dalam file. Apakah Anda mendeklarasikan variabel atau sesuatu yang lain sebelumnya? Info lebih lanjut di sini: docs.microsoft.com/en-us/powershell/module/…Oke, pertama-tama ini melanggar fitur keamanan dasar di PowerShell. Dengan pemahaman tersebut, berikut adalah cara Anda melakukannya:
Anda mungkin ingin memberikan
-NoProfile
argumen di sana juga tergantung pada apa yang dilakukan profil Anda.sumber
Anda bisa mendeklarasikan parameter Anda di file, seperti param:
[string]$para1 [string]$param2
Dan kemudian panggil file PowerShell seperti itu
.\temp.ps1 para1 para2....para10
, dll.sumber
Mungkin Anda bisa membungkus pemanggilan PowerShell dalam
.bat
file seperti ini:rem ps.bat @echo off powershell.exe -command "%*"
Jika Anda kemudian menempatkan file ini di bawah folder di Anda
PATH
, Anda dapat memanggil skrip PowerShell seperti ini:Namun, mengutip bisa sedikit berantakan:
ps write-host """hello from cmd!""" -foregroundcolor green
sumber
Anda mungkin tidak mendapatkan "xuxu p1 p2 p3 p4" seperti yang terlihat. Tetapi ketika Anda berada di PowerShell dan Anda mengatur
Anda dapat menjalankan skrip tersebut seperti ini:
atau
atau
Saya harap itu membuat Anda sedikit lebih nyaman dengan PowerShell.
sumber
jika Anda ingin memanggil skrip ps1 dari cmd dan meneruskan argumen tanpa menjalankan skrip seperti itu
powershell.exe script.ps1 -c test script -c test ( wont work )
Anda dapat melakukan hal berikut
setx PATHEXT "%PATHEXT%;.PS1;" /m assoc .ps1=Microsoft.PowerShellScript.1 ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*
Ini dengan asumsi powershell.exe ada di jalur Anda
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype
sumber