Laman » bagaimana untuk » Bagaimana Menggunakan Fail Batch untuk Membuat Skrip PowerShell Lebih Mudah untuk Run

    Bagaimana Menggunakan Fail Batch untuk Membuat Skrip PowerShell Lebih Mudah untuk Run

    Untuk beberapa sebab, kebanyakannya berkaitan dengan keselamatan, skrip PowerShell tidak semudah mudah alih dan dapat digunakan sebagai skrip batch. Walau bagaimanapun, kami boleh menyusun skrip batch dengan skrip PowerShell kami untuk mengatasi masalah ini. Di sini, kami akan menunjukkan kepada anda beberapa kawasan masalah tersebut, dan bagaimana membina skrip batch untuk mengelilingi mereka.

    Mengapa saya tidak boleh menyalin fail PS1 saya ke komputer lain dan jalankan?

    Kecuali sistem sasaran telah dikonfigurasikan terlebih dahulu untuk membenarkan skrip sewenang-wenangnya, dengan keistimewaan yang diperlukan, dan menggunakan tetapan yang betul, kemungkinannya anda akan menghadapi beberapa masalah apabila anda cuba melakukan ini.

    1. PowerShell tidak dikaitkan dengan sambungan .PS1 fail secara lalai.
      Kami memulakannya dalam siri PowerShell Geek School kami. Windows associates .PS1 fail ke Notepad secara lalai, bukannya menghantarnya ke penterjemah perintah PowerShell. Ini untuk mengelakkan pelaksanaan script skrip yang tidak disengajakan dengan hanya klik dua kali. Ada cara anda boleh mengubah tingkah laku ini, tetapi mungkin bukan sesuatu yang anda ingin lakukan pada setiap komputer yang membawa skrip anda ke sekitar - terutama jika sesetengah komputer tersebut bukan milik anda.
    2. PowerShell tidak membenarkan pelaksanaan skrip luaran secara lalai.
      Tetapan PelaksanaanPolicy dalam PowerShell menghalang pelaksanaan skrip luaran secara lalai dalam semua versi Windows. Dalam beberapa versi Windows, lalai tidak membenarkan pelaksanaan skrip sama sekali. Kami menunjukkan kepada anda cara mengubah tetapan ini dalam Cara Memungkinkan Pelaksanaan Skrip PowerShell pada Windows 7. Bagaimanapun, ini juga sesuatu yang anda tidak mahu lakukan pada mana-mana komputer.
    3. Sesetengah skrip PowerShell tidak akan berfungsi tanpa keizinan Pentadbir.
      Walaupun berjalan dengan akaun peringkat Pentadbir, anda masih perlu melalui Kawalan Akaun Pengguna (UAC) untuk melakukan tindakan tertentu. Kami tidak mahu menyahdayakan ini, tetapi ia masih bagus apabila kita boleh membuatnya lebih mudah untuk ditangani.
    4. Sesetengah pengguna mungkin mempunyai persekitaran PowerShell yang disesuaikan.
      Anda mungkin tidak akan masuk ke dalam ini selalunya, tetapi apabila anda melakukannya, ia boleh membuat berjalan dan mengatasi skrip anda sedikit mengecewakan. Nasib baik, kita dapat mengelilingi ini tanpa membuat perubahan kekal juga.

    Langkah 1: Klik dua kali untuk dijalankan.

    Mari mulakan dengan mengatasi masalah pertama - persatuan fail PS1. Anda tidak boleh klik dua kali untuk menjalankan .PS1 fail, tetapi anda boleh melaksanakan fail. BAT dengan cara itu. Oleh itu, kami akan menulis fail kelompok untuk memanggil skrip PowerShell dari baris arahan untuk kami.

    Oleh itu, kita tidak perlu menulis semula fail kumpulan untuk setiap skrip, atau setiap kali kita menggerakkan skrip, ia akan menggunakan pembolehubah rujuk diri untuk membina laluan fail untuk skrip PowerShell. Untuk membuat kerja ini, fail kumpulan perlu diletakkan di dalam folder yang sama dengan skrip PowerShell anda dan mempunyai nama fail yang sama. Jadi jika skrip PowerShell anda dipanggil "MyScript.ps1", anda akan mahu nama fail kumpulan anda "MyScript.bat" dan pastikan ia berada dalam folder yang sama. Kemudian, letakkan baris ini dalam skrip batch:

    @ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSE

    Sekiranya bukan untuk sekatan keselamatan yang lain, itu benar-benar diperlukan untuk menjalankan skrip PowerShell daripada fail kumpulan. Sebenarnya, baris pertama dan terakhir adalah hanya satu perkara keutamaan - ia adalah barisan kedua yang benar-benar melakukan kerja. Inilah pecahan:

    @ECHO OFF mematikan arahan bergema. Ini hanya menyimpan perintah anda yang lain daripada menunjukkan pada skrin apabila fail batch dijalankan. Baris ini sendiri tersembunyi dengan menggunakan simbol di (@) di hadapannya.

    PowerShell.exe -Command "& '% ~ dpn0.ps1'" sebenarnya menjalankan skrip PowerShell. PowerShell.exe sudah tentu boleh dipanggil dari mana-mana tetingkap CMD atau fail batch untuk melancarkan PowerShell ke konsol kosong seperti biasa. Anda juga boleh menggunakannya untuk menjalankan arahan terus dari fail kelompok, dengan memasukkan parameter -Command dan hujah-hujah yang sesuai. Cara ini digunakan untuk mensasarkan fail .PS1 kami dengan pemboleh ubah% ~ dpn0 khusus. Jalankan dari fail kelompok,% ~ dpn0 menilai kepada huruf pemacu, laluan folder, dan nama fail (tanpa sambungan) fail kumpulan. Oleh kerana fail kumpulan dan skrip PowerShell akan berada dalam folder yang sama dan mempunyai nama yang sama,% ~ dpn0.ps1 akan diterjemahkan ke laluan fail penuh skrip PowerShell.

    PAUSE hanya menjeda pelaksanaan batch dan menunggu input pengguna. Ini biasanya berguna untuk mempunyai pada akhir fail kumpulan anda, supaya anda mempunyai peluang untuk menyemak sebarang output arahan sebelum tetingkap hilang. Semasa kita melalui ujian setiap langkah, kegunaan ini akan menjadi lebih jelas.

    Oleh itu, fail batch asas disediakan. Untuk tujuan demonstrasi, fail ini disimpan sebagai "D: \ Lab Lab \ MyScript.bat" dan terdapat "MyScript.ps1" dalam folder yang sama. Mari lihat apa yang berlaku apabila kita mengklik dua kali MyScript.bat.

    Sudah tentu skrip PowerShell tidak berjalan, tetapi itu diharapkan - kami hanya menangani empat masalah pertama kami. Walau bagaimanapun, terdapat beberapa bit penting yang ditunjukkan di sini:

    1. Tajuk tetingkap menunjukkan skrip batch berjaya melancarkan PowerShell.
    2. Baris output pertama menunjukkan bahawa profil PowerShell tersuai sedang digunakan. Ini adalah masalah yang berpotensi # 4, yang disenaraikan di atas.
    3. Mesej ralat menunjukkan sekatan ExecutionPolicy yang berkuatkuasa. Itulah masalah kami # 2.
    4. Bahagian yang menggarisbawahi mesej ralat (yang dilakukan secara luaran oleh output ralat PowerShell) menunjukkan skrip batch itu dengan betul menyasarkan skrip PowerShell yang dimaksudkan (Lab: Script Script \ MyScript.ps1). Jadi kami sekurang-kurangnya tahu bahawa banyak berfungsi dengan baik.

    Profil, dalam kes ini, adalah satu skrip satu talian yang mudah digunakan untuk demonstrasi ini untuk menghasilkan output apabila profilnya aktif. Anda boleh menyesuaikan profil PowerShell anda sendiri untuk melakukan ini juga, jika anda ingin menguji skrip ini sendiri. Hanya tambah baris berikut ke skrip profil anda:

    Profil 'PowerShell Custom Write-Output' berlaku! '

    ExecutionPolicy pada sistem ujian di sini ditetapkan kepada RemoteSigned. Ini membolehkan pelaksanaan skrip yang dibuat secara setempat (seperti skrip profil), sambil menyekat skrip dari sumber luar kecuali mereka ditandatangani oleh pihak berkuasa yang dipercayai. Untuk tujuan demonstrasi, arahan berikut telah digunakan untuk menandakan MyScript.ps1 sebagai sumber luar:

    Add-Content -Path 'D: \ Lab Labs \ MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '

    Yang menetapkan Zon.Identifier aliran data alternatif pada MyScript.ps1 supaya Windows akan berfikir fail datang dari Internet. Ia boleh dengan mudah diterbalikkan dengan arahan berikut:

    Clear-Content -Path 'D: \ Lab Labs \ MyScript.ps1' -Stream 'Zone.Identifier'

    Langkah 2: Melayari PelaksanaanPolicy.

    Menerusi tetapan ExecutionPolicy, dari CMD atau skrip batch, sebenarnya cukup mudah. Kami hanya mengubah suai baris kedua skrip untuk menambah satu lagi parameter kepada arahan PowerShell.exe.

    PowerShell.exe -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"

    Parameter -ExecutionPolicy boleh digunakan untuk mengubahsuai ExecutionPolicy yang digunakan apabila anda menanamkan sesi PowerShell yang baru. Ini tidak akan berterusan di luar sesi itu, jadi kita boleh menjalankan PowerShell seperti ini bila-bila masa kita perlu tanpa melemahkan postur keselamatan umum sistem. Sekarang kita telah menetapkan itu, mari kita pergi lagi:

    Sekarang skrip telah dilaksanakan dengan betul, kita dapat melihat apa sebenarnya yang dilakukannya. Ia memberi kami tahu bahawa kami menjalankan skrip sebagai pengguna Terbatas. Skrip sebenarnya sebenarnya dijalankan oleh akaun dengan kebenaran Pentadbir, tetapi Kawalan Akaun Pengguna semakin dalam perjalanan. Walaupun butiran bagaimana naskah memeriksa akses Pentadbir berada di luar skop artikel ini, berikut adalah kod yang digunakan untuk demonstrasi:

    jika (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output 'Running as Administrator!' else Tulis-Output 'Running Limited!' Jeda

    Anda juga akan melihat bahawa terdapat dua operasi "Jeda" sekarang dalam output skrip - satu dari skrip PowerShell, dan satu dari fail kumpulan. Alasan untuk ini akan lebih jelas dalam langkah seterusnya.

    Langkah 3: Mendapatkan akses Administrator.

    Jika skrip anda tidak menjalankan sebarang perintah yang memerlukan ketinggian, dan anda pasti tidak perlu risau tentang profil peribadi sesiapa pun yang ada di dalamnya, anda boleh melangkau seluruh perkara ini. Sekiranya anda menjalankan beberapa cmdlet Pentadbir peringkat, anda akan memerlukan sekeping ini.

    Malangnya, tidak ada cara untuk mencetuskan UAC untuk ketinggian dari dalam fail kumpulan atau sesi CMD. Walau bagaimanapun, PowerShell tidak membenarkan kami melakukan ini dengan Proses Mula. Apabila digunakan dengan "-Verb RunAs" dalam hujah-hujahnya, Proses Mula akan cuba melancarkan aplikasi dengan keizinan Pentadbir. Jika sesi PowerShell tidak ditinggikan, ini akan mencetuskan prompt UAC. Untuk menggunakannya dari fail batch untuk melancarkan skrip kami, kami akan menamatkan pemijahan dua proses PowerShell - satu untuk memadamkan Proses Mula dan yang lain, dilancarkan oleh Proses Mula, untuk menjalankan skrip. Barisan kedua fail kumpulan perlu ditukar kepada ini:

    PowerShell.exe -Command "& Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"

    Apabila fail kumpulan dijalankan, barisan output pertama yang akan kita lihat adalah dari skrip profil PowerShell. Kemudian, akan ada prompt UAC apabila Proses Mula cuba melancarkan MyScript.ps1.

    Selepas mengklik melalui prom UAC, contoh PowerShell yang baru akan bertelur. Kerana ini adalah contoh baru, tentu saja, kami akan melihat notis skrip profil sekali lagi. Kemudian, MyScript.ps1 berjalan dan kita melihat bahawa kita sememangnya berada dalam sesi yang tinggi.

    Dan ada sebab kita mempunyai dua jeda di sini juga. Jika bukan untuk skrip PowerShell, kami tidak akan melihat output skrip - tetingkap PowerShell akan muncul dan hilang sebaik sahaja skrip selesai berjalan. Dan tanpa henti dalam fail batch, kami tidak akan dapat melihat jika terdapat sebarang kesilapan yang melancarkan PowerShell di tempat pertama.

    Langkah 4: Mendapatkan profil PowerShell tersuai.

    Mari kita hapuskan notifikasi profil peribadi yang buruk ini, adakah kita? Di sini, hampir tidak ada gangguan, tetapi jika profil PowerShell pengguna mengubah tetapan lalai, pembolehubah, atau fungsi dalam cara yang anda mungkin tidak dijangkakan dengan skrip anda, mereka boleh menjadi sangat menyusahkan. Lebih mudah untuk menjalankan skrip anda tanpa profil sepenuhnya supaya anda tidak perlu bimbang tentang perkara ini. Untuk melakukan itu, kita hanya perlu menukar baris kedua fail batch sekali lagi:

    PowerShell.exe -NoProfile -Command "& Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"

    Menambah parameter -NoProfile ke kedua-dua keadaan PowerShell yang dilancarkan oleh skrip bermakna skrip profil pengguna akan benar-benar dilangkau dalam kedua-dua langkah dan skrip PowerShell kami akan berjalan dalam persekitaran yang boleh diramalkan dengan jelas. Di sini, anda dapat melihat tidak ada notis profil tersuai di salah satu daripada cangkang yang dihasilkan.

    Jika anda tidak memerlukan hak Administrator dalam skrip PowerShell anda, dan anda telah melangkau Langkah 3, anda boleh melakukan tanpa contoh PowerShell kedua dan baris kedua fail kumpulan anda harus kelihatan seperti ini:

    PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"

    Output kemudian akan kelihatan seperti ini:

    (Sudah tentu, untuk skrip bukan Pentadbir, anda boleh lakukan tanpa jeda akhir skrip di skrip PowerShell anda pada masa ini juga kerana semuanya ditangkap dalam tetingkap konsol yang sama dan akan diadakan di sana dengan jeda di hujung fail kumpulan juga.)

    Fail kumpulan lengkap.

    Bergantung pada sama ada atau tidak anda memerlukan kebenaran Pentadbir untuk skrip PowerShell anda (dan anda tidak boleh meminta mereka jika anda tidak) fail kumpulan akhir harus kelihatan seperti salah satu daripada dua di bawah.

    Tanpa akses Admin:

    @ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'" PAUSE

    Dengan akses Admin:

    @ECHO OFF PowerShell.exe -NoProfile -Command "& Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs" PAUSE

    Ingat untuk meletakkan fail kelompok dalam folder yang sama dengan skrip PowerShell yang anda mahu gunakan untuknya, dan berikan nama yang sama. Kemudian, tidak kira apa sistem anda mengambil fail-fail tersebut, anda boleh menjalankan skrip PowerShell anda tanpa perlu memasukkan sebarang tetapan keselamatan pada sistem. Anda pastinya boleh melakukan perubahan itu secara manual setiap kali, tetapi ini menjimatkan masalah anda dan anda tidak perlu bimbang tentang membalikkan perubahan kemudian.


    Rujukan:

    • Menjalankan skrip PowerShell dari fail kumpulan - Blog Pemrograman Daniel Schroeder
    • Memeriksa keizinan Pentadbir di PowerShell - Hey, Scripting Guy! Blog