Mengapa "menemukan" tidak dapat digunakan di PowerShell

4

Apa tidak find.exe menemukan keberatan tentang parameter ketika digunakan dalam shell konsol PowerShell? Perintah-perintah ini berfungsi seperti yang diharapkan dalam a cmd.exe kulit.

PS C:\Windows\System32\WindowsPowerShell\v1.0> find /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> find /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Windows\System32\find.exe /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Windows\System32\find.exe /i "System.Diagnostics.Process" .\DotNetTypes.format.ps1xml
FIND: Parameter format not correct
lit
sumber
Itu bukan perintah Powershell? Jangan bingung antara ipconfig yang dapat dieksekusi dan perintah shell perintah
Ramhound
Apa yang dia gunakan selain C:\Windows\SYSTEM32\find.EXE?
lit
Apa yang sebenarnya ingin Anda lakukan? Contoh ketiga Anda menggunakan sintaks yang tidak valid
Ramhound
memang saya mencoba perintah yang persis sama dan gagal di PowerShell sambil memberikan output yang tepat dalam cmd. Bahkan where find bekerja dalam cmd tetapi tidak di PowerShell
phuclv
Saya berada di konsol PowerShell. Saya ingin mencari file untuk string. find.exe apakah itu. Ya, saya tahu bahwa PowerShell juga dapat melakukannya dengan Get-Content ... dll. Saya hanya mencoba melakukan sesuatu yang sederhana. Apakah itu tidak mungkin di PowerShell? Saya telah menulis grep Script PowerShell seperti, tetapi tidak pada sistem ini dan saya tidak ingin memburunya malam ini.
lit

Jawaban:

3

Mencoba:

find /i "`"System.Diagnostics.Process`"" *.ps1xml

Saya menggunakan Sysmon.exe untuk membandingkan eksekusi di PowerShell.exe dan cmd.exe:

Untuk cmd.exe:

 Image: C:\Windows\System32\find.exe
 CommandLine: find  /i "System.Diagnostics.Process" *.ps1xml
 ParentImage: C:\Windows\System32\cmd.exe

Untuk PowerShell:

 Image: C:\Windows\System32\find.exe
 CommandLine: "C:\Windows\system32\find.exe" /i System.Diagnostics.Process *.ps1xml
 ParentImage: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

kita dapat melihat bahwa di PowerShell, tanda kutip di sekitar istilah pencarian tidak ada, jadi dengan menambahkan seperangkat tanda kutip ganda itu seharusnya berfungsi.

Peter Hahndorf
sumber
1
Jadi, PowerShell menghapus tanda kutip dari parameter baris perintah. Sneaky. Terima kasih.
lit
2

Seperti yang dikatakan Peter Hahndorf, PowerShell sedang menghapus tanda kutip luar . Anda dapat memeriksanya secara langsung dengan menggema atau menulis string langsung di baris perintah

PS C:\> echo C:\Windows\System32\find.exe /i "System.Diagnostics.Process" *.ps1xml
C:\Windows\System32\find.exe
/i
System.Diagnostics.Process
*.ps1xml
PS C:\> "System.Diagnostics.Process"
System.Diagnostics.Process

IMHO itu hal yang baik karena sekarang Anda dapat menggunakan tanda kutip tunggal untuk membungkus string. Anda juga memiliki cara standar untuk memberikan parameter karakter khusus yang mirip dengan bash, tidak seperti dalam cmd dimana menanamkan tanda kutip ganda menyebalkan

Jadi menurut Aturan mengutip PowerShell Anda harus lolos dari kutipan dengan baik `backticks` atau kutipan ganda itu sendiri, atau cukup kutip dalam satu kutip

find.exe /i "`"System.Diagnostics.Process`"" *.ps1xml
find.exe /i """System.Diagnostics.Process""" *.ps1xml
find.exe /i '"System.Diagnostics.Process"' *.ps1xml

Dalam kasus-kasus sederhana seperti ini ketika tidak ada ruang dalam parameter Anda juga dapat melarikan diri dari tanda kutip ganda secara langsung tanpa memasukkannya ke dalam pasangan tanda kutip lainnya

find.exe /i `"System.Diagnostics.Process`" *.ps1xml

Namun ada cara yang lebih mudah Argumen verbal --%

Di PowerShell 3.0, penanda khusus --% adalah sinyal untuk PowerShell untuk berhenti menafsirkan karakter yang tersisa di telepon. Ini dapat digunakan untuk memanggil utilitas non-PowerShell dan meneruskan beberapa parameter yang dikutip dengan benar.

Alhasil Anda bisa menggunakannya seperti ini

find.exe --% "System.Diagnostics.Process" *.ps1xml
phuclv
sumber