PowerShell -Part 3
■ このスレッドは過去ログ倉庫に格納されています
>>305
Windows 文化と言うより、業務でオツちゃん・オバちゃんに使わせるシステムの場合、
あいだに黒い画面が一瞬出ると「なにこれ?」って無用な問い合わせが入ったり、
場合によっては無理やり閉じられることもある。
fool proof の観点からは黒い画面が無いに越したことはない。 " が含まれている文字列を環境変数にいれてnet useコマンドを使うと" がエスケープされず想定通りに処理されないのですがどうエスケープすればいいんでしょうか
シングルコーテート、バックコーテート、ダブルコーテートで"をくくってもだめでした たとえばですが
$pass = test123"45
net use c:¥temp ¥¥192.168.1.10 $pass /user:testuser
とした時にパスワードに含まれている"が文字列として認識されずコマンドが実行されないのです
これをエスケープしようと
$pass = test123"""45
$pass = test123'"45
などとしてもうまくいかない感じです net useはpowershellのコマンドプロンプト用、powershellではNew-Psdriveコマンドレット、powershellのエスケープ文字は基本バックスラッシュ` 1行目間違えた
net useはコマンドプロンプト用 net use ではなく new-psdriveだとバクスラでエスケープ可能なんですか?
net useだとエスケープできなかったので、ちょっとやってみまふ ちなみにパワーシェルからcmd /cでコマンド呼び出すときのエスケープキーはバクスラと^のどちらですか? 本件は
$pass='123"45'
とすればいいだけ シングルコーテートでくくってもエスケープできるんですね
ありがとうございます エスケープじゃなくて、Powershellでは文字列は必ず'か"どっちかで囲う。生身はだめ。'で囲うのは静的リテラルの場合 結局環境変数は関係ないのか?
> " が含まれている文字列を環境変数にいれて 本当の初学者で変数もコマンドプロンプトと同じ概念なんだろ なるほどそういうルールあるんですね
プログラムやったことないんでしらんかったす
リテラルってのも意味わからんかったくらいや start-processで終了を待たずにps1実行していくのは疑似並列処理として考えて良いのでしょうか 「`」はバッククォートだ馬鹿者
バックスラッシュ(\)とは違う >>309
間違いないよう(見間違いも)にだったらヒアストリングつかったらどうでしょう
行は増えますが、エスケープ考える必要もかいから。
@"
test123"45
"@ whoamlで取得した実行結果のユーザ名を一行で環境変数に入れるにはどうすれば良いでしょうか
whoami 実行
結果 testpc¥user1
と結果が返ってくる場合、
$test = whoami.split("¥")[1]
と言ったかたちで
$testにuser1を格納させたいのですがうまく行きません 読んでみたけど違いがよくわからん
型を持つってとこ? 型じゃなく範囲・スコープだよ
環境変数はOSが管理していて、ひとつ値をセットしたら同じ環境内の他プロセス(アプリ)がその値をOSに教えてもらえる
普通の変数はプロセス内で管理されていて、他プロセスは見ることが出来ない Linux では、~/.bashrc に環境変数を書けば、
自分(そのユーザーだけ)が起動するプロセスから、アクセスできる
etc/ 以下なら、PC 全体の設定になる
~/.bashrc は、Windows ではユーザー環境変数。
一方、システム環境変数は、PC 全体の設定で、すべてのユーザーで共有される
例えば、Tで始まる環境変数なら、
ls env: | Where-Object {$_.name -like "T*"} >>326
それを実行している自分自身のユーザ名が欲しいだけなら、わざわざそんなことしなくても
$env:USERNAME
で引っ張ってこれる。
出し惜しみ、小出しにしないで前後関係も話さないと的確なアドバイスが出来ないよ。 >>331
.bashrcはPowershellでは$Profileに当たると思うわ つーか、Credential使えよ
今時ハードコートとかありえん >>334
だね。
どうやら ID:x9ea9mMQ ID:d/eT01GS はネットワークドライブのマウントがやりたいようだけど、
dos batch で使うべき net use や whois を PowerShell で使おうとすることに
無理がある。出来なくもないけどエレガントじゃない。
PowerShell でやるなら New-PSDrive だな。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-psdrive
-Credential で任意の(自分以外の)クレデンシャルも指定できるから、
ID:x9ea9mMQ の要件も(たぶん)満たせるだろう。 コマンドレット使える所を外部コマンド使うなよとは思うね
出力から値をテキスト抽出で取り出すとかもエレガントではないな
あとlsとかcatとかdirとかのコマンドエイリアス使うのも微妙に感じる Get-ChileItemに-Depthなんてオプションあったんだな。
うちの会社は↓みたいな整然としたフォルダ構成だから
こういうオプションあるとすごく助かるわ
プロジェクト管理
└2018年
└1Q
└プロジェクトA
└プロジェクトB
└2Q
└プロジェクトC
└3Q
└プロジェクトD
└4Q
└プロジェクトE
└プロジェクトF
└2019年
└1Q
└プロジェクトG tree形式で図示しただけ。
gciの-Depth は再帰検索する深さの指定 ID:iBsL10N5 自身が言うべき事だが
阿呆指摘についカッとなった 清濁併せ呑んでこそのPowershell
なんたって名前からしてパワーだからな
力業もどんとこい .NET Core 3.0 Preview 1でWPF、Windows Forms, WinUIが組み込まれてオープンソース化したんか
ほえー >>342
Preview出てたんだ
早速使ってみたい Linqっぽいことはできる
(1..10).ForEach({ $_ + 100 }).Where({ $_ -gt 105 })
Linqメソッドも呼べるけどC#のようにインスタンスメソッドな感じでは使えない
[Linq.Enumerable]::Where(1..10 -as [int[]], { param($x) $x -gt 5 } -as [Func[int,bool]]) 必要な箇所でC#コード書けばいいじゃん
外人のコード読むと皆そうやってるよ @echo offと同等のコマンドってパワーシェルにありますか? >>348
エコー防止したいなら
$null = 式
式 | Out-Null
式 > $null
[void]式
どれでもどうぞ powershellでメール受信やるならMailkitがいいですかね? UWPスレが死んでるのでこっちで聞き直すね
起動してるUWPアプリの列挙ってpowershellでどうやればいいですかね?
全く出てこないんですが Get-WmiObject Win32_Process | where Path -like "*\WindowsApps\*" | fl Process Id,Name,Path
とか >>345
具体的にどんなことをやりたいか書いていただくと
PowerShellでLINQ利用した場合の例を挙げられると思うけど 職場のPC(セキュリティ上の理由でネットに繋がらない)がWin7→Win10になったんだが
PowerShellのヘルプがオンラインヘルプだけになって見れないのでつらい Get-HelpとかISEのコマンドアドオンじゃダメなん >>355
遅くなった & 説明が間違えてたごめん
Get-Helpコマンド自体は使えるんだけど-Fullオプション付けても付けない時と同じ内容しか出てこない
つまり使用例が見れないのでPowerShellを最近使い始めた自分にはつらい
ISEもヘルプを見ようとすると「ネットに繋がりません」みたいなエラーになった
もうリファレンス本買うことにするよ・・・orz 別PCでSave-Helpでファイルダウンロードして手動で配置したらあかんの? >>357
セキュリティガチガチの保険会社の現場なんで無理っす><
ってか↓これポチりましたw
https://www.amazon.co.jp/dp/477415542X 変数展開するときに、
$test
と
${test}
ではなにが違うんですか? >>360
基本一緒でしょう
GetType()
してみるとわかりますと同じですね。
ただし、${}の指定では配列のインデックス指定できない
${a[0]} とかは許されないですね。
なんでこういうのがあるかは分りません。 $test = "TEST"
"test$testtest"
"test${test}test"
こういう時にでも使うんじゃねーの
求める形に適当なのを使えばいいんじゃねーかな 中括弧つければ通常使えない文字も使える
${\(^o^)/} = "オワタ"
${ Hello ?? World! `nby powershell } = "hi"
どんな文字列でも変数名として有効であることが保証されるからコード生成とかで使われるらしい
普通は文字列への埋め込み時くらいしか使わんね >>360
私はコードの可読性を高めるためになるべく ${hoge} といった形で記述するようにしてます。
あと、文字列をつなぐような場合でも ${hoge} が使われます。
$hoge = "hoge"
echo "${hoge}fuga"
この場合は「hogefuga」が出力されますが、
$hoge = "hoge"
echo "$hogefuga"
これでは$hogefuga という変数を参照することになるので思ったように動作しません。 なるほどね
$test="TEST"
"test"+$test+"test"
より次の方がスマートかもね
"test${test}test" >>363
そういえば日本語の変数もできるんでしたね ダブルコーテーション内で変数を値展開させたい場合空白文字で区切られていないとだめ。つまり
echo "$hoge fuga"
であれば
hoge fuga
にはなる。
hogefugaを得たい場合、俺なら
echo ($hoge+"fuga")
と書く echoを使う理由はなんかあるのかな?
私はecho自体つかわないので ログを標準出力に出力するときに普通に使う
aho=echo `command`
こうやってコマンドの標準出力の結果を環境変数にいれるときにも
普通に使う
echoなかったらなに使えばいいワケ? いや、使う場面がないので聞いただけ
通常ログに返すときにはそのままechoなしで書いているもので
上記のやり取りの例だとechoいらないな〜と思ったまで echo使わなくてもコマンドの標準出力の結果を変数に入れられるのでは?
環境変数??? オプション付けないなら意味はない
使う機会は-NoEnumerateするときくらいかな
-NoEnumerateすると配列を塊のままパイプに流せる
"1-one","2-two" | foreach { Write-Output ($_ -split "-") } | Write-Host
1
one
2
two
"1-one","2-two" | foreach { Write-Output ($_ -split "-") -NoEnumerate } | Write-Host
1 one
2 two 失礼した
パワー系池沼シェルについてはオレは知らん
スレタイみずに普通のシェルの話してるかと思ってたわ そのまま書けば標準出力先への出力ですよね
私も不勉強なのですが、場合によりほかのシェル言語経験の方で
そちらではそれが普通なので、その習慣で書いているとかないですかね?
PSの環境変数にも特段echoいらないと思うし。 $env:aho = command で普通に入るね
echoとWrite-Outputの役割はpsに慣れてない人への広い意味でのエイリアスだと思う
シェル言語はツールとしての側面があるから、不使用の方が高尚だと矯正するようなものでもないと思う ループでWrite-Outputすると遅い気がする (measure-command{
$first = [datetime]"2000/1/1"
$last = [datetime]"2018/1/1"
foreach($t in 0..($last - $first).TotalHours)
{
$first + [timespan]::FromHours($t)
}
}).TotalMilliseconds
の
$first + [timespan]::FromHours($t)
を
Write-Output ($first + [timespan]::FromHours($t))
にすると3倍くらいかかる >>372
> 上記のやり取りの例だとechoいらないな〜と思ったまで
ぜんぜんそれでも文法&動作的にはオッケーです。
可読性、保守性を上げるためのマイルールです。
自分だけがメンテするスクリプトなら問題ありませんが、複数の人間が
読む可能性がある場合は「何をやろうとしているのか」を
明確にするためにそうしています。
PowerShell に明るくない人が読む可能性もありますから。
なお echo は Write-Output のエイリアスですので念のため。 > なお echo は Write-Output のエイリアスですので念のため。
一言余計、そんなことは誰でも知ってる。勘違い馬鹿なID:b6CiPLFa以外は この流れで思い出した
PSの出力をログに同時に吐くようにできませんか? Start-Transcript ファイル名 -append >>358
あ、用意されていて簡単にできたはずだ。なんだっけな・・・ alias と入力してみ。
漏れは、Linux・コマンドプロンプトのalias を使う
%, ?
cat, cd, chdir, cp, curl, dir, echo, foreach, ls,
man, mv, ps, pwd, ren, rm, rmdir, tee, type, wget, where
たいていは、Ruby からPowerShell(PS) を呼ぶか、
ダブルクリックで起動したい時は、VBScript から呼ぶ
Ruby, PS, VBS が入り乱れる ps:オレのPC
PS >.\datecount.ps1 > xxx.txt
----
datecount.ps1(>>379)
date
$first = [datetime]"2000/1/1"
$last = [datetime]"2018/1/1"
foreach($t in 0..($last - $first).TotalHours)
{
$first + [timespan]::FromHours($t)
}
date
----
xxx.txt
2018年12月23日 0:02:31 ← 開始
2000年1月1日 0:00:00
2000年1月1日 1:00:00
(-snip-)
2017年12月31日 23:00:00
2018年1月1日 0:00:00
2018年12月23日 0:03:37 ← 終了 bash:オレのPC(>>392と同じ計算機)のvmwareのcentos
$ ./datecount.sh > xxx.txt
----
datecount.sh
#!/bin/bash
date
FIRST=`date +%s -d "2000/1/1 0:00:00"`
LAST=`date +%s -d "2018/1/1 0:00:00"`
A=$((FIRST-=3600))
while [ ${A} -lt ${LAST} ]
do
date -d @$((A+=3600)) "+%Y年%-m月%-d日 %k:%M:%S"
done
date
----
xxx.txt
2018年 12月 22日 土曜日 23:59:44 JST ← 開始
2000年1月1日 0:00:00
2000年1月1日 1:00:00
(-snip-)
2017年12月31日 23:00:00
2018年1月1日 0:00:00
2018年 12月 23日 日曜日 00:01:53 JST ← 終了 改めてパワー系池沼シェルの遅さが実感できたわ
linuxのほうは毎回dateコマンド経由して結果を取得するものすごい悪い条件なのに
パワー系池沼シェルは組込みオブジェクト使ってもこの速度だからな
組込みオブジェクトを使わなかっらどうなるか
つまりそういうことになる
お話にならない。。。 >>390
だけじゃなくてswitch(式)の式の値にも使われてる
意外と便利 PSでテキスト処理する上でそんままやるやつ居るんやな 結果をlogに出力するだけならすぐ終わるべ
2018年12月23日 1:44:41
2000年01月01日 00:00:00
2000年01月01日 01:00:00
2000年01月01日 02:00:00
2017年12月31日 22:00:00
2017年12月31日 23:00:00
2018年01月01日 00:00:00
2018年12月23日 1:44:43 ピラフ大王なんて、PowerShell で、5ch のスレをスクレイピングするよw
漏れは、Ruby でやるけど 単に出力がネックになってるだけだからな
dateなんて関係ねえw >>379は変数への代入とかを想定して書いたんだけどな
値を返すのを関数型言語っぽく式で書けるのはいいけど、
手続き的なコードと混ざる場合もあるからコードの意図が分かりにくくなりがち 計算結果をリストに入れるだけなら0.3秒で終わる
つまりほぼ画面出力かかってる時間なのに
それを組み込みオブジェクトがどうのこうの訳わからんこと言ってる馬鹿さよ psちゃんはストリーム出力がやたら遅い上に日本語ロケールだとさらに遅い ■ このスレッドは過去ログ倉庫に格納されています