Windows PowerShell Part5 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
あの。大変申し訳ありません。書き込んですぐなんですけど。2文字追加するだけでいけました・・・。
ls C:\Users\nanashi\Desktop\aaa\* -r | ?{$_.PSisContainer} | %{mi $_.FullName C:\Users\nanashi\Desktop\aaa -Force} あるフォルダに
Movie_00_(<肝心のファイル名>).mp3
Movie_01_(<肝心のファイル名>).mp3
Movie_02_(<肝心のファイル名>).mp3
以下続く...
というファイルがあって
このフォルダで
Get-ChildItem | ForEach-Object {Rename-Item -Path $_ -NewName $_.Name.Remove(0, 1)}
これを実行すると
一回目はファイル名の最初3文字が消えて、ie_00_(<肝心のファイル名>).mp3 に
この状態で再度実行すると今度は一文字だけ消えて、e_00_(<肝心のファイル名>).mp3
この状態で再度実行すると今度は二文字消えて、00_(<肝心のファイル名>).mp3
ってなっちゃうんですがなぜでしょうか。
以前この手のファイル名置換はうまくできてたんですけど。
すごくあほな勘違いかミスだと思うのですが
もうずっと考えてもわからないので助けてください。 >>669 ですが、
Get-ChildItem Movie* としてフィルタをかけた状態でやったらうまくいきました。
どうして? Forループの途中で名前が変わってるのがミソ
ループの列挙子が_A〜Za〜zの順にファイルをピックアップする
Mで始まるファイル名を一通り拾って置換した後
置換後の名前はoで始まるから同じループ内で再度ピックアップされてしまう
M, o, v まで文字コード昇順に並んでるから1回のループで1文字ずつ3回置換されてる
次のiはvよりも若い文字だからもう走査済みなのでそこで止まる おー、そういうことなのか
ありがとう。
単純にファイルのリストを作って次のループに渡すんじゃないのね、
今後もはまることありそうだわ。 一つのコマンド処理が終わるのを待ってパイプで受け渡してたら
メモリと時間がうなぎのぼりに増えていく オブジェクトを渡せるメリットとのトレードオフなので素人ではないよ いやむしろそれこそがパイプラインだろと
一体誰が素人って話なんだ PwerShellをbuildしようとしてるんだけど
DotNetEventingStrings
がコンテキストに含まれていないと叱られます
これはどのモジュールに含まれてるんでしょうか? 共有フォルダ(\\192.168.0.1\hoge)上でpower shellを動かしたいんだけど
証明書なしだから実行出来ないというエラーが出てしまう
オレオレ証明書での実行の仕方もいまいちわからんのですが
参考なるところ教えてくれませんか
社内で使うとかで、makecert.exeとかは無い状態です
助けてお願い 実行ポリシーは何にセットされてるの?
変えて良いなら変えるのが手っ取り早いと思うけど リモートホスト上で走らせたいのか、クライアント上で走らせたいのか?リモートなら当然認証や権限の問題を適切に処理せんとどうしようもない すみません
調べても分からなかったのでご教示ください
標準出力をパイプに渡してエラーのみをファイルにリダイレクトということはできるのでしょうか
2> file 1| command
にすればいいんでしょうか? よく意味がわからない
パイプはエラーを通さない。通すのは標準出力のみ
エラーをファイルにリダイレクトするには
command 2>a.txt
のようにする powershellでcpu100%になれば下げたり何かのタスク終了したりできますか? たぶんそのような機能はあるはずだが
Windows でその種の機能って実用的な動きしないこと多いしな CPU100%だからpowershell動けないんじゃw ありがとう。なんかアプリでありそうですね。
電源管理で100%押さえれますわ。
60%とかにしときました。 GPOの設定を自動化したいんですけどGPMCとかいうの入れずにやる方法ありませんか? ポリシーってのはセキュリティ周りのを除けば基本的にレジストリの設定集と思えばいい
逆説的に言えばポリシーで設定されるレジストリ値を設定してしまえばいいだけ
ドメインポリシーみたいな強制性が欲しいとか
そういう管理面での要件があるなら別だけどパンピーなら
該当するレジストリを設定すりゃ間に合うはず
もちろんすべてがすべてそうという訳じゃないが powershell v2でテキストの文字列置換する方法教えて
(gc a.txt).replace("aaa","bbb") |Out-File b.txt
ってやるとv3では通るんだけどv2だとエラーになっちゃいました >>696
エラー内容が「[System.Object[]] に 'replace' という名前のメソッドが含まれない」なら、これ↓じゃない?
https://stackoverflow.com/questions/35641714/system-object-doesnt-contain-a-methodnamed-replace
[IO.file]::ReadAllText('C:\a.txt').replace("aaa","bbb")|Out-File b.txt >>697
ありがとうございます。
やってみたのですが[IO:file]という型がありませんとか表示されちゃいました
因みにosはwindows2008r2です すみません頭に[System.IO.file]とやったらいけました powershell2.0で教えてください
単純にフォルダをネットワークドライブ配下に移動したいのですがいい方法はありませんでしょうか
何故かファイル単位だとうまくいきます
↓な感じです
Move-Item "元ファイル" -destination \\server\log
3.0だと同じ処理をやってもうまくいくのに何故2.0はこんな簡単なことも出来ないのか半泣き状態です >>700
どんなエラーが出るとか、どういう結果になったとか書くとアドバイスもらいやすいよ
2.0でも Move-Item -Path "元フォルダ" -Destination \\server\log でOKなはずだけど
Windows Server 2008でもWindows Management Framework 3.0でpowershell 3.0が使えるようになるけど、サーバだと他の影響が怖くて変更しにくいのかな? -Forceつけてダメだったら
Move-Itemあきらめて
PS> Copy-Item "元ファイル" -destination \\server\log\ -recurse
PS> Remove-Item "元ファイル" -recurse
かな
原因は突き止めた方がいいと思うけど
PS> gi "元ファイル" | % {$_.MoveTo(“\\server\log\“)}
でもダメなんだろうなあ >>702
スマホから書いたら全角混じっちゃった
失礼 >>701-703
ありがとうございます
エラー内容については仰るとおりです
失礼いたしました
なおエラーは↓が出ていました
Move-Item:ソースとターゲットのパスは同一のルートを持たなければなりません。[移動]操作はボリューム間で行えません。
個人的にはpowershellv3を入れないのですが商用サーバーということもありそうも行かず…
頂いた内容でまず試してみます >>702
試してみたところcopy-item、remove-itemでうまくいきました!
何故move-item出来ないのか謎ですが一旦これでいきます
ありがとうございました スクリプトで
VPNセッションを張って、opensshでLinuxサーバーにログインしたいんですが、クレデンシャル情報ってどう引き渡せば良いですかね Announcing Windows 10 Insider Preview Build 19037
https://blogs.windows.com/windowsexperience/2019/12/06/announcing-windows-10-insider-preview-build-19037/
Windows PowerShell ISE is now a Feature on Demand (installed by default), and you will see it in the list in Optional Features Settings. コマンドプロンプトでcopy /b file1 + file2 out
でバイナリ結合できるけど
Get-Contentではどう頑張ってもできない?
結局cmd /c copy 〜 でやってる copy xcopyをpowershellで完全に置き換えられるレベルまでMSには頑張って欲しかったなぁ xcopyで出来るものならxcopy使うけど
なんたってrobocopyとは速さが桁で違ってて比べ物にならない ファイルコピーに野良ライブラリーは使いたくない
コマンドプロンプトからの移行をMSが本気で考えていたならファイルコピー機能はまず最初に実装すべきなのに robocopyをPowershellから実行できるから別にいいや
リッチなコピーコマンドをまた覚えるのも面倒だし >>715
「コマンドプロンプトの外部コマンド」じゃなくて「OSに標準搭載されてるコンソールアプリ」だと考えろ
Get-Command xcopyやGet-Command robocopyを実行するとCommandTypeがApplicationになってるんだし
PowerShellは名前の通りシェルであって
シェルからアプリを起動するのを躊躇する理由は全くない えっ、PowerShell 7ってMicrosoft Storeでリリースされるの
https://github.com/microsoft/terminal/pull/4273/files
Windows Terminalのプルリクエストだがそれらしき記述が >>712
>なんたってrobocopyとは速さが桁で違ってて比べ物にならない
xcopy遅いですよね 名前にブラケットとか入ってるディレクトリをカレントディレクトリにして
適当なファイルにGet-Item -LiteralPath hogeとかするとObjectNotFoundになる。
内部で絶対パスを生成するときにカレントディレクトリのパスをエスケープしているようだ。
LiteralPath使ってんだから勝手にエスケープすんなやアホか。 新しいクロスプラットフォームの PowerShell をお試しください Microsoft、「PowerShell 7.0」を一般公開 〜三項演算子やnull結合演算子をサポート
「.NET Core 3.1」ベースとなり、3年間のLTSサポートが付属
ttp://forest.watch.impress.co.jp/docs/news/1238950.html .net特化型スクリプト言語、って割りきってるのかなとも思ったけど
どうも開発陣はこの言語構文が優れているという信念を持ってるらしい
Python と似た芳ばしさを感じる
あんまり近寄りたくない 7って管理者モードで起動しているかいないかがコンソールウィンドウのタイトルで分からなくなってる? 7.0.0はMicrosoft Storeでのリリースはなしか
7.0.0-rc.3ではGitHubにあった.msixもない フォルダ内のjpgの画像データを一括でリサイズするとき、拡張子をjpegではなくjpgのままで変換したいのですが可能なのでしょうか >>726
UNIXシェルの構文はもっと糞だけどな >>730
正直、余計なことしてない分シェルとしてはUnix シェルの方が使いやすい
言語として貧弱なのはあくまでもシェルが本文と割りきってるからで
言語機能を強化するためにシェルとして分かりにくくなってるPowerShell よりもツールとしては百億倍合理的 echoの仕様すら統一できてないくせに合理的だの使いやすいだの
なんのギャグやら PowerShell のように奇妙キテレツな挙動じゃないからなそこまで実害がないもの 言語としての機能はPowerShell の方が上だよ
でも単純にShell として考えた場合の実用性はbashどころかcshにも劣る まあ裏返せばCLIの使い勝手しか改善のしようがなくなっちゃっただけなんだけどね
多分10年20年先も*shの読みづらさは変わらんだろうし 読みづらさなんて最初だけ
Unix の世界は慣れれば同じルールで一貫してやっていけるから楽
PowerShell なんてパイプラインの挙動がオブジェクトや文脈で変わりまくって、かなりの経験者でも動かしてみるまでどうなるか予想できないだろ?
Unix ならしばらく勉強すればログから複雑な条件で問題行を抽出するとかできるようになる
同じ期間PowerShell 学習した奴が同じことしようとしたら、自動書式化回避するために丸一日潰すことになる
Unix でせっかく克服した
Multicsのバッドプラクティスを
ご丁寧に復活させようとしてるのがWindows だろ ということは、もう一回りすれば、良い物ができるかもしれないのだな
トンプソンみたいな人がいれば...だが > PowerShell なんてパイプラインの挙動がオブジェクトや文脈で変わりまくって
意味が分からないんで解説お願い >>738
わからないから使えてる(気がしてる)んだろう
>>739
そういうのは挙動に一貫性があって言えること
慣れたところでその慣れが極めて局所的にしか役に立たないんじゃたいして役に立たない
MSの製品はアプリもAPI もみんなそう デバッグの第一歩がいきなりログ解析じゃ話にならない・・・原始的すぎる・・・ >>742
結局丸一日考えてその程度のことしか言えないのか >>736
> PowerShell なんてパイプラインの挙動がオブジェクトや文脈で変わりまくって
具体例よろしく
まあ笑える例しか出てこないと思うけどw >>740
一貫性がないのはUNIXシェルだろ
偉そうなこと言うのはechoの挙動くらい統一してからにしろ
何のためのPOSIXなのやら >>744
昔外部コマンドをパイプでつないだらバイナリデータが化けてイーッてなった覚えがあるんだけど
あれからだいぶバージョン上がったが、そろそろ直ってる? PowerShellでパイプに流せるのはテキストかオブジェクト
バイナリ流すとテキストだと思ってUnicodeに変換しちゃうらしい 外部コマンド呼んでstderrになんか出るとエラーになるのマジでうざい
cmdletちゃうんやからLASTEXITCODEだけで判断せえよ stderrは乱用されすぎなんだよ
PowerShellのWrite-VerboseやWrite-Debugはもっと評価されるべき Windows10にPowerShell7入れたんだがGet-Clipboardが
The term 'Get-Clipboard' is not recognized...
ってなるんだけどなんで?
ちなみにSet-Clipboardは使えた なんでだろ
gmo "Microsoft.PowerShell.Management" | % exportedcommands
の出力にGet-Clipboardあるか探してみて なんか知らんが今やったら使えた
>>751 のコマンド入れたから?
できなかった時から起動しっぱなしのシェルだからそれぐらいしか考えられない & hogehoge.exe 2> "hoge[1].txt"
なんてことをたいんだけど、これだとブラケットをワイルドカード展開しようとしてエラーになる。
[WildcardPattern]::Escape()使うとエラーにはならないけどファイル名にバッククォートが入る。
どうすればいいですか?
もしくはstdoutは捨ててstderrだけパイプラインに流す方法とかありますか? (& hoge.exe 2>&1|?{$_ -is [System.Management.Automation.ErrorRecord]}).Exception|Out-File -LiteralPath 'a[1].txt'
でできた 6.0以降はWindows powerShellじゃないんだが、このスレで話してもいいの? 外部コマンドの出力をパイプラインでつないでごにょごにょしようとしたら
外部コマンドが終わらないと次の処理に行かないんだが、どういうこと?
MS-DOSに先祖返りしたんか? 7.0.1が出て.appxが復活したもののなぜかPreview扱いになってるな
Windows TerminalでもPreviewとみなされてる(アイコンがPreview版) ググると文字列は+で繋げるとありますが、
$word="坂本"
echo $word+"竜馬"
だと坂本+竜馬と表示されるのですが?
$word="坂本"
echo $word"竜馬"
だと坂本龍馬と表示される。 >>764
ありがとうございます。
分かりました。 >>763
PowerShell流にやるならechoはいらないので
$word="坂本"
echo $word+"竜馬"
としないで
$word="坂本"
$word+"竜馬"
とすれば望まれた結果になりますよ >>766
関数でも最後ならreturn要らないの? >>767
要らない
他の言語のように return $a とか書けるけど
$a
return
と同じ意味 PSでは代入などの文にせずに式を書くだけでコンソールに出るから基本echoは要らない
echoにはおそらく互換性のために、式モードと引数モードというのがあって、引数モードだと引用符が要らない
最初から
echo 坂本竜馬
と書ける
式モードにするなら
echo ($word+"竜馬")
のようにかっこで囲む
>関数でも最後ならreturn要らないの?
最後だけでなく途中に書いた式による出力も全部戻り値としてパイプに渡される
PSにおいてreturnは戻り値を返すというより関数を抜ける役割で使うもの >>763
で、簡単じゃんと思ってディレクトリもこれで繋がると思ってみたり
ディレクトリはJoin-Path使う罠 7.0.2, 6.2.6が出た
7.0.2の.msixは相変わらずPreview版扱い Previewになってるのは7.1で修正するらしい Invoke-CommandでリモートPCのGUIコマンドを実行し、かつGUIの出力先を
そのリモート上の任意のセッション(consoleやrdp-tcp)にすることってできますか? そのguiアプリがコマンドラインオプションで出力先を指定できる仕組みを持っていればできるんじゃない? ググりまくってようやく答えを見つけました↓
https://serverfault.com/questions/690852/use-powershell-to-start-a-gui-program-on-a-remote-machine
LinuxみたいにXアプリを他ディスプレイに飛ばす(xhostで許可設定して -display :N オプションをつける)
みたいな真似は、やはり仕様上困難のようです。そりゃそうですね。
というわけで、PSToolsのpsexecを使うとやりたいことができました。
@qwinstaで出力したいセッションのIDを調べる
psexec \\リモートホスト -u ユーザ名 -p パスワード qwinsta
A-iオプションにそのIDを指定
psexec \\リモートホスト -u ユーザ名 -p パスワード -i セッションID notepad
(ちなみにOpenGLみたいにローカルのコンソールセッションでないと起動できないプログラムの場合は
事前にtsconコマンドでコンソールセッションをActiveにしておくのが必要です) Powershellでディレクトリ内も含めてファイル名だけ取得することってできますか?
Get-ChildItemのオプションで-Recursiveと-Nameだとディレクトリ名もついてくる Get-ChildItem -Recursive | %{$_.Name} Get-ChildItem -Recurse -Name -File 最適解は>>780なんだろうけど
いつも Get-ChildItem -File -Recurse | % Name としてしまう ありがとう。結果は
-Nameだとディレクトリ名も入ってしまう
| %Nameだとエラー
|%{$_.Name}だとファイル名のみ表示できた
でした なんで書いたとおりに試さないの?
%Name でなく、 % の後に空白の入った % Name
% は ForEach-Object の alias だから ForEach-Object Name ってこと ついでに言っとくと -File がないとディレクトリ名も表示される >>783
エイリアスわかんない相手にエイリアスつかっちゃ駄目な奴では コマンドラインでは gci -File -Recurse | % Name だな
Get-ChildItem なんて補完するのも面倒過ぎる dirでもlsでもgciでも手になじんてるのでいいよ Get-ChildItemdirちょー手になじんてる >なじんてる
日本語は馴染んでないようだね
そういう人にしか使えないから、いまいち普及しないんだろうね 濁点のミスはスマホ入力でよくあるから気にならない
けどGet-ChildItemdirっていうワードが謎で文意がまったく掴めねぇー
エスパーすると本命は、Get-ChildItemと書きたかったけどdirを消し忘れた
対抗は、Get-ChildItem手になじんでる!と言いつつコマンドレット名間違ってましたテヘペロという高度なボケ 私はたかがPowerShellすら使えない無能ですまで読んだ >>795
お前はWin7環境を強いられている民を全員敵に回した コンソールにかき捨てならエイリアスでいいけど
スクリプトになんでもエイリアス仕込む奴のコードは扱いたくない
コードゴルフじゃないんだし あっっっっっったりまえのことだな
>>797 にもあるけど
>When working interactively at the Windows PowerShell console, the primary purpose is to accomplish something. I want to get the task completed accurately, and timely. I do not want to expend any extra effort to accomplish the task.
こういう時はaliasを使うし、
>On the other hand, when I write a Windows PowerShell script, the purpose is to have something I can use over and over again.
>The goal here is reusability, not speed of development and execution. Therefore, I do not want to use aliases in my script because it hinders readability and understanding.
こういう時はaliasを使わない
gci | ? LastWriteTime -ge 2020/8 | sort LastWriteTime
( gci | ? lastw[TAB] -ge 2020/8 | sort lastw[TAB] )
とか結構使うけど、スクリプトでは絶対こんな書き方はしない
>>787 だって
>コマンドラインでは gci -File -Recurse | % Name だな
と断りを入れてあるんだからaliasの適切な利用だと思う CodeGolfして
gci | ? L*r*e -ge 2020/8 | sort L*r*e
でも動く 7.1.0-preview.6
Microsoft Storeに来たな VBAとかC#もこの板にスレ立てた方が盛り上がるんじゃないだろうか >>805
お前は何年前の話をしてるんだよ
FileSystem の Get-Content
https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847788(v=wps.640)
-Stream <文字列>
このパラメーターは、Windows PowerShell 3.0 で導入されました。 PowerShell単体でBluetooth LEとか変なことやろうとしてるけど、
最後の最後で機器からのNotifyを受け取るのにWindows Runtimeのイベントを扱う必要が出てきて、PowerShellでは対処できそうにないなあ
Windows.Devices.Bluetooth.GenericAttributeProfile.GattCharacteristicオブジェクトのValueChangedイベントをRegister-ObjectEventしようとすると
Windows PowerShell cannot subscribe to Windows RT events.とか怒られる .NET 5.0が出たってことはPowerShell 7.1の正式リリースももうすぐか >>811
Microsoft Storeにも正式版が来たな
Previewと共存も可能 >>807
マジだ…知らんったわ
-asbytestreamとか見てあー最近こんなのあるんだ進歩してるなーとか思ってた ps1を隠蔽化しようと思ったらどうするのがいいんだ
Ps2exeでは簡単にデコンパイルされちゃうのは分かったんだけど >>814
難読化なら Invoke-Obfuscation ってのがあるよ >>815
サンクス!
こういうのが欲しかった!
これとExe化とか併用したら結構隠蔽力強いかな >>810
iOSやAndroidにも必要になるぞ Windowsの設定でアプリをリセットできますが、これを行うコマンドはあるのでしょうか?
インストール/アンインストールはAdd/Remove-AppxPackageでできるので、Appx関係を見てみましたが、分かりませんでした Remove-AppxPackage -PreserveApplicationData
の逆で、設定をクリアしたいと考えております ttps://winaero.com/reset-a-store-app-in-windows-10-using-powershell/ >>824
ありがとうございます。
まだ、1909から上げてないので、Reset-AppxPackageがありませんでした。
アップデートするか、別の方法へのリンクもありましたので、そちらも検討したいと思います。 「ごみ箱を空にする」の自動化はググればけっこう見つかるけど、実際やってみるとCMD窓が出てきてしまう。
これを出さずにサイレントで実行させるショートカットが作りたいんだけどなあ。 >>828
前者はVC++の導入が必要ゆえ、少しハードルが高いな。
後者は使いこなせば強力そうだ。チャレンジのしがいがあるな。後者でいってみよう。 今のwin10はcsc.exeが入ってるのでc#のラッパーでもいいと思う
いまどきnetでもたつかないし 多分C♯より前からあるcsc.exe(chicken scheme compiler)が潰されて困る Windows10環境で使用しています。
膨大なログファイルから「error」を含む一文と、
| ではじまる一文を抜粋したいので、Select-String を使えばよいということまでわかりました。
Get-Content *.log | Select-String " Error "
でなんとか「error」を含む一文を拾うところまではできました。
その先の2点で詰まってます。
[質問1]
| ではじまる一文をor検索する為、
sls " Error ","エラー","^| " (dir -recurse *.log)
とすると、意図していない大量の文章が抽出されてしまいます。
おそらく "^| " 部分が正しくないと思われますが、
「〜という文字で始まる」という指示がどうすればよいのでしょうか。
[質問2]
・そのままSelect-String をすると、「ファイル名:行番号:検索結果」という表示になってしまいます。
・Get-Content *.log だと検索結果だけが表示されます。
以下のようなイメージで、ファイル名とその検索結果一覧をまとめて表示させたいのすが、可能でしょうか。
(そもそも Select-String では難しいのでしょうか)
---------------------------
File001.log
2021/02/01 なんとかかんとかErrorなんとかかんとか
| なんとかかんとか
| なんとかかんとか
---------------------------
File002.log
2021/02/01 なんとかかんとかErrorなんとかかんとか
| なんとかかんとか
--------------------------- 正規表現のエスケープは\
正規表現使わないなら -SimpleMatch 正規表現はこんな感じになるかな
sls "¥berror¥b|エラー|^¥| "
結果の書式についてはファイル名や検索結果を変数に入れてifやforで古典的な処理を書けばどうとでもなる >833さん、834さん
ご返信いただきありがとうございます。
試行錯誤した結果、以下が希望に近くなりそうです。
sls "error|エラー|^\|" (dir -recurse *.log)
書式については、上記の結果に合致するファイル名を変数に入れて・・・
とfor分をまわす感じで、ちと考えてみます。 バッチにすりゃ済む事なのに手を抜いて一行で済まそうとするから嵌まるのではないのかよ? 便乗して Select-String について質問よろしいでしょうか
「特定の文言が記録されているtxtファイル」のフルパス一覧を取得したいンですが
sls "error" (dir -recurse *.log)
とすると「パス、行番号、該当の行」が出力されますよね
ここでパスだけの一覧を出力することは可能でしょうか
もちろんバッチでもOKでございます powershellは、iniファイルの中のデータを変数に入れたりとかはできますか? >>838
powershell iniファイル読み込み
あたりでググれば色々出てくるよ
ちょっと制限あるけど XML に変換しちゃうとかなかなか面白い
http://nmksb.seesaa.net/article/473354419.html >834 さんのアドバイスに従って、自分なりにいろいろ試行錯誤してみました。
おそらくあと一歩で理想形になるのですが、躓いてしまっております。
以下の内容で「PS1」ファイルを作成します。
---------------------------
#検索して"error"に合致するファイル一覧を取得し、合致したファイル名を[$fileList]へ入れる
$fileList = Get-ChildItem -recurse | sls -pattern "error" | group path | select name
#ファイル毎にループ
foreach($fileTmp in $fileList)
{
#ファイル名と"error"を含む検索結果を表示する
write-host $fileTmp.Name,(Get-Content *.* -Encoding UTF8 | sls "Error" $fileTmp)
}
---------------------------
[出力結果]
sls : 入力オブジェクトをコマンドのパラメーターにバインドできません。コマンドがパイプライン入力を受け入れないか、または
入力とそのプロパティが、パイプライン入力を受け入れるいずれのパラメーターにも一致しません。
---------------------------
おそらく
(Get-Content *.* -Encoding UTF8 | sls "Error" $fileTmp)
このあたりの処理に問題があると思われるのですが、どのように記載すればパイプライン入力が受け入れられるのでしょうか。 843さん、844さん、845さんありがとうございました。
パイプで渡すのをやめたら、それなりにいい感じになりました。
ここでアドバイスいただいたことはとてもいい勉強になりました。
精進します。 エスケープシーケンスで困ってます
Select-String hoge.txt -Pattern "$hoge2"
などで$hoge2にエスケープシーケンスがあると当然上手く行きません
毎回、関数を作ってエスケープシーケンスを処理してるのですが
上手くくくるなどもっとスマートな方法は無いでしょうか? >>848
-SimpleMatchオプション付けて文字列にすれば? >>848
ごめん変数なんだね
自分で関数作らなくても
$hoge2 = ([regex]::Escape($hoge2))
で正規表現クラスにエスケープさせちゃえばどうかな? うわお!
こんなのが欲しかったんです
やっぱりこういうスマートなのありますよね
ありがとうです 行を反転させる方法はないですか?
例えば1行目を最後の行に、最後の行を1列目にしたいです
[最大行数..1]
でも出来るのですがもっと綺麗に書けそうなので
よろしくお願いします Powershell ver 5.1で動かすスクリプト内の特定のコマンドレットのみPowershell ver 2.0で動かす事は可能でしょうか?
5.1で動かす部分と2.0で動かす部分で変数の受け渡しも必要です。 新しい側でGet-CommandしてDLL属性見てみれば本体のパスは取れる
互換性あるか不明だけどやってみたら PowerShellから可能なWindows設定の一覧とかどこかにないですかね?
WIndowsのインストール後に行う各種設定を自動化したいです windowsの設定を直接powershellでイジることは不可能だけどレジストリとかをイジることは可能
というかwindows10の設定同期はマイクロソフトアカウントが1番楽で安心だと思う 全部の設定が可能だろ
でないとguiなしのwindowsは設定が出来ない 具体的に何の設定を移行したいのか「全部」書いてほしいけど
物によってはpowershellでいちいちオブジェクト考慮してやるよりレジストリいじる方向のほうが楽だったりするだろうし、適材適所で 唐突にchdir HKML:してファイルシステムみたいにレジストリ探索できるの楽しい
regeditはインポートエクスポートでカルマが溜まるし、専用cmdletもドライランしなきゃ怖いし
普通のファイルみたいにダンプや検索もできるから、インタラクティブに探索するのが良いと思うよ linuxから移行した人としては、winは何でも仮想デバイスなのが進んでるなと思いました
unix系では/devが相当するけど、直下にファイルとしてズラリで階層化されてなくて、仮想ファイルでしかない
階層化しないなら、ファイルである意味ってぶっちゃけ無いよね C:\
20210413
D.mp3
E.mp3
F.mp3
20210227
A.mp3
D.mp3
E.mp3
20210118
A.mp3
B.mp3
C.mp3
20201125
A.mp3
B.mp3
↑こんなフォルダ構成があって、↓こんな風に全ファイルをALLフォルダにコピーしたいのですが
C:\
ALL
A.mp3
B.mp3
C.mp3
D.mp3
E.mp3
F.mp3
どういうコマンドを書けば良いか見当もつきません。アドバイス頂けないでしょうか? ↑すみません、最初の1行は「C:\」じゃなくて「C:\音楽\」でした。 * で検索して全部ALLフォルダにコピーすればいいんじゃないの
エクスプローラで コピーではなくプレイリストの使い方を覚えたほうがいいような気もする Get-ChildItem C:\ -Filter *.mp3 -Recurse | Move-Item -Destination C:\ALL -Confirm 返信遅れてすみません。
>>869さんのコマンドでいけました。(移動でも問題ありません)
みなさんどうもありがとうございました。 import-excelでExcelファイルを読み込んで
配列内の文字列を検索して、見つかったインデックスを取りたいのですが、
うまく検索できません。なぜでしょうか。
ソース
$excel = Import-Excel .\hostname.xlsx
$excel
[Array]::IndexOf($excel,'server3')
結果
host
----
server1
server2
server3
server4
server5
server6
-1
↑2が返ってきてほしいのになぜか-1になるのです。 >>872
[Array]::IndexOf($excel.host,’server3')
または
$excel.host.IndexOf('server3') >>873
ありがとうございます
上手くできました! 今までコマンドプロンプトを使っていましたが、windows power shellに乗り換えました。
コマンドプロンプトでは、エクスプローラーからドラッグ&ドロップでファイルパスが入力できましたが、
windows power shellではできませんでした。
ファイルパスを楽に入力する方法はないんでしょうか? 7.2.2のpwshだけどできたよ
でもCUIでドラッグ&ドロップしようという発想はなかった
ファイラからパスコピーするかファイラからpwsh呼び出してるわ ドラッグアンドドロップはできる
別スレでも同じ質問あったけど管理者として実行しているとダメ
コマンドプロンプトも同じ del /f %appdata%\microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt 可能な限りログというログを消すバッチ
コマンドプロンプト管理者モード実行用だけど
https://pastebin.com/raw/7PYwDkDr Windows Management Framework 4.0が落とせなくなってる powershellって.netオブジェクトを扱うために作られたシェルと知って愕然とした
bashやzshのように(慣れは必要なものの)ほぼCUI操作で完結できるようになるかと思いきや、そういう方向じゃないんだな
Windowsユーザでもマウス使いたく人だっているのにな .netオブジェクトを扱うためってのは誰のどういう立場での発言?
どこぞのYouTuber?
仮に公式見解だとして、CUI操作で完結できるようにというゴールと排他だとする理由は? Exposing the Power of .NET in a Admin-friendly way
https://learn.microsoft.com/en-us/archive/blogs/monad/exposing-the-power-of-net-in-a-admin-friendly-way
> One of our primary goals for Monad was to: "Expose the power of .NET in an Admin-friendly way" 新しいバージョン 7.3.3 をここから
ttps://github.com/PowerShell/PowerShell/releases/tag/v7.3.3
これを
PowerShell-7.3.3-win-x64.msi
インストールしたのですが、
Win+x メニューから管理者として起動しても、古いものが立ち上がるんです
新しいものが起動するようにするにはどうしたらいいのでしょうか >>888
よくわからんけど、Win+Xのアレは「Windows PowerShell(5.1系)」でFixされていて、「PowerShell Core(6.x以降)」への変更は無理なのでは? >>889
どうもありがとうございます
一般メニューのほうから起動することにしました 手っ取り早いのはwinキー, p, w, s, Enter
必要に応じて矢印キーでrun as administratorを選ぶ
Windows11なら「設定」で標準のコンソールを変えることができる
Windows10なら %LOCALAPPDATA%\Microsoft\Windows\WinX の中身を手で書き換える
desktop.ini も隠れてるので書き換え忘れずに
ミスってメニュー壊しても知らんので自己責任で わざわざWin+Xを書き換えなくてもwinキー, p, w, s, Enterが早いしどんなコマンドにも応用が効くのでおすすめ 応用が効くと書いたので蛇足しとく
Win+R でコマンドをフルに打たなくても最近はスタートメニューにフォーカスがあるときコマンドのインクリメンタルサーチができる
古いほうは powershell.exe、新しいほうは pwsh.exe という実行ファイル名なので pws まで打ち込むと候補が絞れる 15年前以上前からできるのに「最近」とは一体... PowerShell でxmlファイルをtxtファイルに
返還することはできますか?
自動化したいんです。 >>898
手動化できているのなら、変換元と変換結果をどこかにあげて例示しよう では読み込んで、クリップボードにコピー
する事はできますか? はい、できます。$cp::SetText(変数)
最初にSystem.Windows.Formsを読み込んでね scoop入れてみたけどすごくいいな。使ってる人いない?
てかロクにpowershellのコマンドを知らないものだから irm get.scoop.sh | iex でなんでインストールできるのが不思議だった
賢いなこれw Get-Contentみたいにテキストファイルを一行毎に配列にしてくれるのを
ファイルじゃなくて標準入力からテキストデータを受け取って配列にする方法はありますか? セットしたい配列変数が $ary の場合
ヒア文字列で
@"
aaa
bbb
ccc
"@ -split "`n" | tee -Variable ary
とすれば $ary に配列がセットされるけど
画面表示がいらないなら | 以降を
| % {$ary=@()}{$ary+=$_}
としてください
ヒア文字列ではなくてクリップボードの内容を受け取りたい場合は
(Get-Clipboard) | % {$ary=@()}{$ary+=$_.ToString().Trim()}
の様にすれば行毎の文字列の先頭・末尾の空白を消して配列に取り込むことが出来るでしょう >>898
txtファイルに変換の意味が改行マークの挿入+字下げで良いのなら
xmlファイルの文字コードがUTF8であれば
$f = "$Env:LOCALAPPDATA\Programs\app_foo\config.xml"
$x = New-Object xml; $x.Load($f); $x.Save($f); Remove-Variable x,f
$f のところは xml ファイルのフルパスを入れて下さい
運用する場合
アプリのフルパスが "$Env:LOCALAPPDATA\Programs\app_foo\bar.exe"
テキストエディタが "C:\Program Files\Notepad++\notepad++.exe" であるなら
C:\tools\edit_xml.ps1 の内容
Set-Alias bar "$Env:LOCALAPPDATA\Programs\app_foo\bar.exe"
Set-Alias editor "C:\Program Files\Notepad++\notepad++.exe"
$f = "$Env:LOCALAPPDATA\Programs\app_foo\config.xml"
ps bar -ea SilentlyContinue | % {$_.CloseMainWindow();$_.WaitForExit()}
$x = New-Object xml; $x.Load($f); $x.Save($f); Remove-Variable x
write "編集が終わったらリターンを押してください"
editor $f
pause
Remove-Variable f
start bar
実行する際は & C:\tools\edit_xml.ps1 で
[x] 押したらトレイに遷移するアプリは手動で終了させる or kill に書き換える必要があるでしょう >>905
ありがとうございます。
あんたは神ですか?! n番目の履歴の実行をInvoke-Historyではなくbashみたいに「!n」ってやる方法ありませんか? なお、腐れChatGPTの回答はなしでお願いします
聞いたら↓でできるとかデタラメ回答よこしてきたし
function global:history-command { Invoke-History $args[0] }; Set-Alias -Name ! -Value history-command -Option AllScope PowerShellでは!ではなくrを使う
あとrと番号の間に空白文字をれる
r 3
みたいな感じ
>>910の場合は!の前に&を付ける必要がある
PowerShellの!は論理否定演算子だからな
&! 3 文句ばっかし言っていないで、さっさと変数の中身くらいはデバッグで間違いに気付くようになれ >>911
ありがとうございます
遅レスですいません カレントフォルダにあるファイルをタブ補完したら頭に.\がつくのがうざい
つかないようにできん? ここのコード試したらできたわ
ttps://superuser.com/questions/1741125/prevent-powershell-autocomplete-from-adding-dot-prefix
中身はさっぱりわからんけどw powershellではカレントディレクトリにある.exeや.ps1を実行するときには先頭に .¥ を付ける必要がある
だから補完時に .¥ を付けることだけを抑制するのはちぐはぐな対応で普通はデメリットが大きい
.¥ が必要になったのはセキュリティを考慮した仕様で、ネット等から入手したzip等の中にnotepad.exe等の既知のアプリと同名のマルウェアを仕込んで騙して実行させるようなトラップの類のリスクを低減するもの >>917
.\notepad.exeを起動させるんですね
それって安全なの? notepad.exeでカレントディレクトにあるやつが実行されるよりは
ファイル名だけで.¥まで補完すなってのはある
bashなんかは./からタイプしないと補完しないよな >>920
自ら補完して気づかず起動したらそれまで
この仕様変更によって守られるケースもあるし守れないケースもある
何事にも完璧はないし100じゃないから0じゃないか意味ないと腐すのは愚か者の考え方
セキュリティと利便性はいつだってトレードオフ >>922
>セキュリティと利便性はいつだってトレードオフ
馬鹿言ってんじゃない。cmdとの互換性なんて要らないのにいまだにカレントディレクトリが探索パスの先頭にあるのが頭おかしいだけ ん、ちょっと変な書き方になった
要はコマンドライン先頭のコマンド名の箇所の補完でカレントディレクトリのファイルが一番最初にしかも丁寧に.\付きで出てくる仕様自体が
.\を付けないと実行できないようにされてる意味すら無くしてるわけで、毎回ユーザーに目視確認させるんじゃないよって話だ oh my poshって今知ったけどかなりイケてるなこれ
powershell専用と思いきや色んなOS、シェルに対応してる
Windows Terminalでpowershell7とwsl2を両方使う人はこれ使うとプロンプトラインに統一感出ていい感じよ
逆に統一感ありすぎてどっちがどっちか区別つかないかもしれんけど function hoge { echo "fuga" }
Set-PSReadLineKeyHandler -Chord Ctrl+u -Function hoge
としたらエラーになった
キーバインドでユーザ定義関数は指定できないの? 何年目かでいうなら今年3年
アイスタイルふざけんなよ上げろや死ね ~がhomeに展開されなくて困る
早いとこ対応してくれ サブディレクトリの下のファイル数をカウントして回るスクリプト
dir -attr D | %{ (dir $_.FullName -attr !D).Count }
おおむね動くんだけどディレクトリ名にスペースがあると0になってしまう
(dir $_).FullName的な挙動になってる気がするんだけどどう書けばいいの? >>932
こういうのもあるけど
(Get-ChildItem [Path] -Recurse | Measure-Object).Count Get-ChildItem <target> -Directory | % {"{0}: {1}" -f $_.Name,$_.GetFiles().Count} でどうでしょうか こう変えるだけでいいよ
dir -attr D | %{ (dir "$($_.FullName)" -attr !D).Count } dir -attr D | %{ (dir -LiteralPath $_.FullName -attr !D).Count }
dir -attr D | %{ ($_ | dir -attr !D).Count } パイプを使って渡しているだけだからそのような結果となってしまう
横着して一行で済ませようとしなけりゃいいんだよw PowerShellでもIF構文とかも利用出来るんだからねw ファイルフルパス中に含まれるスペースなどはコマンド区切り文字として扱われてしまうので実行時にエラーとなってしまう
for %%1 in ("%MediaPath%") do (set MediaPath=%%~s1)
短いファイル名へと一旦変更するなど工夫をして利用する >>932
具体的にどんなディレクトリ名なの?
軽く検証してみたけどディレクトリ名にスペースを含んでも普通に動作する
角括弧を含むとダメで >>936 みたいに-LiteralPathを使う必要がある
っていう感じだった レス数が900を超えています。1000を超えると表示できなくなるよ。