前スレ
PowerShell -Part 4
https://mevius.5ch.net/test/read.cgi/tech/1577862511/
次スレは>>980が立ててね!!
探検
PowerShell -Part 5
■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 00:29:52.04ID:/MpReTiX
706デフォルトの名無しさん
2021/11/08(月) 00:48:09.32ID:j5xrb+V9707デフォルトの名無しさん
2021/11/08(月) 01:18:37.98ID:bmKVlrQF 標準出力じゃなくてファイルに出力するなら、何も考えなくてよくて簡単なんですけどねぇ
708デフォルトの名無しさん
2021/11/08(月) 14:40:09.96ID:ATC6W+sR (echo foo &) | Receive-Job -Wait
709デフォルトの名無しさん
2021/11/08(月) 15:36:36.21ID:J2dLpPYS 配列にしてファイル名取得してコピーする動きさせたです
以下のようなイメージを浮かべていますが上手くいかなくてどう書いたらいいか有識者の方教えてください
$aaa[0]=〜.txt
$aaa[1]=〜.log
$aaa[2]=〜.sh
foreach($i in 0..2){
copy-item -force aaa[$i] $コピー先
}
$?で戻り値判定
以下のようなイメージを浮かべていますが上手くいかなくてどう書いたらいいか有識者の方教えてください
$aaa[0]=〜.txt
$aaa[1]=〜.log
$aaa[2]=〜.sh
foreach($i in 0..2){
copy-item -force aaa[$i] $コピー先
}
$?で戻り値判定
710デフォルトの名無しさん
2021/11/08(月) 15:58:10.99ID:J2dLpPYS 自己解決したかも
下記でうまく動きましたわ頭悪い書き方かもしれないが
$aaa=@(ファイルパス,ファイルパス,ファイルパス)
$aaa | foreach-object { copy-item -force $aaa コピー先}
下記でうまく動きましたわ頭悪い書き方かもしれないが
$aaa=@(ファイルパス,ファイルパス,ファイルパス)
$aaa | foreach-object { copy-item -force $aaa コピー先}
711デフォルトの名無しさん
2021/11/08(月) 17:02:26.88ID:UsmHmtDw パスの引数はliteralpath使った方がいいよ
普通のpathだとワイルドカードが有効になって面倒なことになる
普通のpathだとワイルドカードが有効になって面倒なことになる
712デフォルトの名無しさん
2021/11/08(月) 17:32:28.75ID:bmKVlrQF literalpathを使った方が安全安心というのはその通りとして
戻り値チェックがなくなってるけど,それでよいのならこれでもいいんじゃないかと
foreach($i in ファイルパス,ファイルパス,ファイルパス){
copy-item -force $i コピー先
}
戻り値チェックがなくなってるけど,それでよいのならこれでもいいんじゃないかと
foreach($i in ファイルパス,ファイルパス,ファイルパス){
copy-item -force $i コピー先
}
713デフォルトの名無しさん
2021/11/08(月) 17:45:54.79ID:J2dLpPYS714デフォルトの名無しさん
2021/11/08(月) 19:18:19.58ID:bmKVlrQF []*なんかはファイル名としては普通に使えるけどpowershellではワイルドカードとして扱われるんでliteralpath使うとよいです
715デフォルトの名無しさん
2021/11/08(月) 20:03:51.47ID:Rlzdbs4L さすがに * は使えないよ
716デフォルトの名無しさん
2021/11/08(月) 21:40:49.31ID:Umd1M9Ks *は使えないけど*は使える
<>は使えないけど<>は使える
つまり
<>は使えないけど<>は使える
つまり
717デフォルトの名無しさん
2021/11/08(月) 22:58:01.79ID:bmKVlrQF718デフォルトの名無しさん
2021/11/09(火) 09:20:55.86ID:6HgHkORr719デフォルトの名無しさん
2021/11/09(火) 18:10:17.23ID:m+qVFCof720デフォルトの名無しさん
2021/11/09(火) 18:14:06.31ID:m+qVFCof721719
2021/11/09(火) 18:25:01.42ID:m+qVFCof CSV なら、
VSCode の拡張機能・Rainbow CSV で、
RainBow Query Language(RBQL)とか、
GrapeCity のExcel Viewer などで、フィルター出来るのでは?
VSCode の拡張機能・Rainbow CSV で、
RainBow Query Language(RBQL)とか、
GrapeCity のExcel Viewer などで、フィルター出来るのでは?
722デフォルトの名無しさん
2021/11/10(水) 23:58:41.48ID:s7s2g3pi Objectの配列ってあるやん?
例えばGet-childitemで返ってくるような奴。
こいつのあるプロパティの値で検索かけて、ヒットするオブジェクトを返してくれるコマンドレットってある?
例えばGet-childitemで返ってくるような奴。
こいつのあるプロパティの値で検索かけて、ヒットするオブジェクトを返してくれるコマンドレットってある?
723デフォルトの名無しさん
2021/11/11(木) 07:34:27.20ID:rdUNi5nM Where-Object
てかそれ知らなくても
Get-Childitem | %{ if($_.プロパティ -eq 'xxxx') $_ }
ってやればいいだけ
てかそれ知らなくても
Get-Childitem | %{ if($_.プロパティ -eq 'xxxx') $_ }
ってやればいいだけ
724デフォルトの名無しさん
2021/11/11(木) 08:50:00.49ID:UywKMbXB パイプラインからオブジェクトを削除する (Where-Object)
https://docs.microsoft.com/ja-jp/powershell/scripting/samples/removing-objects-from-the-pipeline--where-object-
PowerShell には、Where-Object コマンドレットがあります。これを使用すると、パイプラインの各オブジェクトをテストし、特定のテスト条件を満たしている場合にのみ、オブジェクトをパイプラインに沿って渡すことができます。 テストを通過しなかったオブジェクトは、パイプラインから削除されます。 テスト条件は、FilterScript パラメーターの値として指定します。
https://docs.microsoft.com/ja-jp/powershell/scripting/samples/removing-objects-from-the-pipeline--where-object-
PowerShell には、Where-Object コマンドレットがあります。これを使用すると、パイプラインの各オブジェクトをテストし、特定のテスト条件を満たしている場合にのみ、オブジェクトをパイプラインに沿って渡すことができます。 テストを通過しなかったオブジェクトは、パイプラインから削除されます。 テスト条件は、FilterScript パラメーターの値として指定します。
725デフォルトの名無しさん
2021/11/11(木) 09:52:00.76ID:73eTlo3I >>723
サンクス。
サンクス。
726デフォルトの名無しさん
2021/11/11(木) 09:52:38.35ID:73eTlo3I >>724
サンクス。
サンクス。
727デフォルトの名無しさん
2021/11/11(木) 09:58:56.40ID:GzUsv1SA プロパティの名前で検索するならこんな方法もありますよ
https://stackoverflow.com/questions/26997511/how-can-you-test-if-an-object-has-a-specific-property
https://stackoverflow.com/questions/26997511/how-can-you-test-if-an-object-has-a-specific-property
728デフォルトの名無しさん
2021/11/11(木) 13:58:48.12ID:AMbWD73B 質問です。
連想配列Aがあって、このAのkeyを要素とする配列Bがあります。
この配列Bの各要素の値のkeyを連想配列Aで対応するValueに全て置き換えたいのですがどうすれば良いでしょう?
新たに配列Cを作ってそこに置き換えた値を代入でもかまいません。
シンプルに出来れば良いのですが。
連想配列Aがあって、このAのkeyを要素とする配列Bがあります。
この配列Bの各要素の値のkeyを連想配列Aで対応するValueに全て置き換えたいのですがどうすれば良いでしょう?
新たに配列Cを作ってそこに置き換えた値を代入でもかまいません。
シンプルに出来れば良いのですが。
729728
2021/11/11(木) 14:20:34.82ID:7Xqdpo5k 重要な事書き忘れてました。
配列Bの要素にマッチする連想配列Aのkeyが存在しなければ、その配列の要素自体削除したい。
配列Bの要素にマッチする連想配列Aのkeyが存在しなければ、その配列の要素自体削除したい。
730デフォルトの名無しさん
2021/11/11(木) 14:30:48.53ID:GzUsv1SA 新規に$cを作ってよいのなら
PS C:\> $a = @{ a=1; b=2; c=3}
PS C:\> $b = @('a','b','c','d')
PS C:\> $c = @()
PS C:\> foreach ( $k in $b ) {
>> if ( $k -in $a.keys ) {
>> $c += $a[$k]
>> }
>> }
PS C:\> $c
1
2
3
PS C:\>
ではどうでしょう?
PS C:\> $a = @{ a=1; b=2; c=3}
PS C:\> $b = @('a','b','c','d')
PS C:\> $c = @()
PS C:\> foreach ( $k in $b ) {
>> if ( $k -in $a.keys ) {
>> $c += $a[$k]
>> }
>> }
PS C:\> $c
1
2
3
PS C:\>
ではどうでしょう?
731デフォルトの名無しさん
2021/11/11(木) 16:10:35.43ID:VwMpkHW9 >> if ( $k -in $a.keys ) {
>> $c += $a[$k]
keysで文字列の配列を作って更にそれを[]で検索して値を得る
って凄く無駄な気がするんだけど
KeyValuePairってPowerSellで使えないんだっけ
>> $c += $a[$k]
keysで文字列の配列を作って更にそれを[]で検索して値を得る
って凄く無駄な気がするんだけど
KeyValuePairってPowerSellで使えないんだっけ
732デフォルトの名無しさん
2021/11/11(木) 17:00:05.70ID:GzUsv1SA getenumeratorでとれますね
733デフォルトの名無しさん
2021/11/11(木) 17:08:23.09ID:GzUsv1SA valueが$nullではない,もしくは,valueが$nullの場合は$cに含めなくてもよいなら
ifの条件を( $null -ne $a[$k] )にできるね
$aの要素がたくさんあるならgetenumeratorでforeachを回して
$bから見つかった要素を削除するのがよいのかな?
ifの条件を( $null -ne $a[$k] )にできるね
$aの要素がたくさんあるならgetenumeratorでforeachを回して
$bから見つかった要素を削除するのがよいのかな?
734デフォルトの名無しさん
2021/11/11(木) 22:45:45.51ID:opowWSFy $a = @{a=1;b=2;c=3}
$b = @("a", "z", "c")
$c = $b | %{ $a[$_] }
これで出来てる?
$b = @("a", "z", "c")
$c = $b | %{ $a[$_] }
これで出来てる?
735デフォルトの名無しさん
2021/11/12(金) 01:15:10.90ID:M7lyd7nj Ruby なら、配列同士の積を使える
hash = { "a"=>1, "b"=>2, "c"=>3 }
p hash.keys #=> ["a", "b", "c"]
p hash.values #=> [1, 2, 3]
ary_1 = [ "c", "x", "b" ]
p ary_2 = ary_1 & hash.keys #=> ["c", "b"]
hash = { "a"=>1, "b"=>2, "c"=>3 }
p hash.keys #=> ["a", "b", "c"]
p hash.values #=> [1, 2, 3]
ary_1 = [ "c", "x", "b" ]
p ary_2 = ary_1 & hash.keys #=> ["c", "b"]
736デフォルトの名無しさん
2021/11/12(金) 04:44:44.57ID:ZAoNN4kS GetEnumerator使ったらこんな感じ
$a.GetEnumerator() |? {$_.key -in $b} | select -exp value
$a.GetEnumerator() |? {$_.key -in $b} | select -exp value
737デフォルトの名無しさん
2021/11/12(金) 04:50:17.45ID:ZAoNN4kS これでも
$a.GetEnumerator() | &{process{if ($_.key -in $b) {$_.value}}}
$a.GetEnumerator() | &{process{if ($_.key -in $b) {$_.value}}}
738デフォルトの名無しさん
2021/11/12(金) 16:12:33.21ID:xE6WDQNQ やたら凝った回答が多いけど、素直に>>734でいいと思うんだが・・・
739デフォルトの名無しさん
2021/11/12(金) 19:04:08.47ID:a3j0d+bF だめじゃね?
$c[1] に $null が入るよ
仕様は
> 配列Bの要素にマッチする連想配列Aのkeyが存在しなければ、その配列の要素自体削除したい。
だし
$c[1] に $null が入るよ
仕様は
> 配列Bの要素にマッチする連想配列Aのkeyが存在しなければ、その配列の要素自体削除したい。
だし
740デフォルトの名無しさん
2021/11/12(金) 19:19:41.08ID:0Z8rlyMb $a.GetEnumerator() |?{$_.key -in $b} |% valueか
GetEnumeratorってすぐ忘れそうだけど補完で出てくるからいっか
GetEnumeratorってすぐ忘れそうだけど補完で出てくるからいっか
741デフォルトの名無しさん
2021/11/12(金) 19:38:43.32ID:ZAoNN4kS おー、Foreach-Objectの短縮記法か
オシャレっすね
そう書けるのは知識として知ってるんだけど、全然出てきませんわ
Select-Object -ExpandProperty使っちゃう
オシャレっすね
そう書けるのは知識として知ってるんだけど、全然出てきませんわ
Select-Object -ExpandProperty使っちゃう
742デフォルトの名無しさん
2021/11/12(金) 19:54:08.84ID:a3j0d+bF > valueが$nullの場合は$cに含めなくてもよい
が許されるなら
$a[$b] -ne $null
でいけそうだけどあとで何やってるのかわからなるなw
が許されるなら
$a[$b] -ne $null
でいけそうだけどあとで何やってるのかわからなるなw
743デフォルトの名無しさん
2021/11/12(金) 22:25:34.60ID:bmw0W+Zd744デフォルトの名無しさん
2021/11/12(金) 22:36:54.20ID:bmw0W+Zd >>740
というか$a.GetEnumerator()から順序が考慮されないから正しい実装としては下記と思われる
$c = $b | ?{$a.contains($_)} | %{ $a[$_] }
というか$a.GetEnumerator()から順序が考慮されないから正しい実装としては下記と思われる
$c = $b | ?{$a.contains($_)} | %{ $a[$_] }
745デフォルトの名無しさん
2021/11/12(金) 23:08:41.99ID:ZAoNN4kS 730に戻ったね
746デフォルトの名無しさん
2021/11/13(土) 00:03:49.31ID:IngrJLwZ >>739
確認したから嘘だろと思ったら本当に入ってた・・・
表示されないのか
じゃあ途中でキーの有無を確認すればいいから、
$b | ?{ $a.ContainsKey($_) } | %{ $a[$_] }
でどうだろう。
「aのキーにあれば出力」をそのまま描いた感じ
確認したから嘘だろと思ったら本当に入ってた・・・
表示されないのか
じゃあ途中でキーの有無を確認すればいいから、
$b | ?{ $a.ContainsKey($_) } | %{ $a[$_] }
でどうだろう。
「aのキーにあれば出力」をそのまま描いた感じ
747デフォルトの名無しさん
2021/11/13(土) 00:04:11.42ID:IngrJLwZ >>744でもう書かれてた
748デフォルトの名無しさん
2021/11/13(土) 07:10:49.19ID:ugM6VKHw 順序気にするなら[ordered]を付ければいい
$a = [ordered]@{a=1;b=2;c=3}
$a = [ordered]@{a=1;b=2;c=3}
749デフォルトの名無しさん
2021/11/13(土) 12:11:25.74ID:DOOK67wF 質問よく見てないからかもしれんけど、$aの順序じゃなくて$bの順序を保証しないとだから意味ない
750デフォルトの名無しさん
2021/11/13(土) 13:11:51.91ID:Z2vNsa/D 最初の質問も曖昧な点多くてグダグダになってる感
こんなんでいいか?
$a=@{a=1;b=2;c=3}
$b=@("a","z","c")
$c=[ordered]@{}
$b|? {$_ -in $a.keys}|% {$c[$_]=$a[$_]}
こんなんでいいか?
$a=@{a=1;b=2;c=3}
$b=@("a","z","c")
$c=[ordered]@{}
$b|? {$_ -in $a.keys}|% {$c[$_]=$a[$_]}
751デフォルトの名無しさん
2021/11/13(土) 13:40:06.49ID:P6Qu4JtN a 暗号解読用テーブル
b 暗号化された本文
て感じ?
b 暗号化された本文
て感じ?
752デフォルトの名無しさん
2021/11/13(土) 14:05:31.30ID:DncAOgGY >>750
元の$bと同じ単純配列が欲しいって書いてあるのにわざわざ連想配列作るとかグダグタになってるのはお前だけだろw
元の$bと同じ単純配列が欲しいって書いてあるのにわざわざ連想配列作るとかグダグタになってるのはお前だけだろw
753デフォルトの名無しさん
2021/11/15(月) 09:18:13.04ID:xJpmlO5M754デフォルトの名無しさん
2021/11/15(月) 09:24:47.63ID:xJpmlO5M すぐ上に同じような事書いてたごめん>>742
valueが$nullな病的なケースまでは扱いたくないから知らん
valueが$nullな病的なケースまでは扱いたくないから知らん
755デフォルトの名無しさん
2021/11/16(火) 08:21:35.56ID:lP4cPAw+ ($b | %{ $a[$_] }) -ne $null が好きだな
-ne はこのための仕様なので合目的的
わかりにくさが不安ならコメントを添えてもいい
containsとアクセサでハッシュテーブルを2回ずつ検索するより好き
-ne はこのための仕様なので合目的的
わかりにくさが不安ならコメントを添えてもいい
containsとアクセサでハッシュテーブルを2回ずつ検索するより好き
756デフォルトの名無しさん
2021/11/17(水) 16:30:42.17ID:DmPYFyCr >>755
結果は同じだけど定義通りじゃないのがな
存在しないキーの値がたまたまnullだった、フィルタしたら偶然求めたい値と一致したに過ぎない
既に言われてるけどValueがnullだと食い違う
やはりcontainsKeyが1番だと思う
パイプが連続してる方がシェルっぽくて見た目もかっこいいし
結果は同じだけど定義通りじゃないのがな
存在しないキーの値がたまたまnullだった、フィルタしたら偶然求めたい値と一致したに過ぎない
既に言われてるけどValueがnullだと食い違う
やはりcontainsKeyが1番だと思う
パイプが連続してる方がシェルっぽくて見た目もかっこいいし
757デフォルトの名無しさん
2021/11/17(水) 17:05:17.34ID:npYvnyKq ああその違いがあったのか
でも発注者が本当に求めている条件がどっちなのかはかなり怪しい事例だと思う(言い訳)
でも発注者が本当に求めている条件がどっちなのかはかなり怪しい事例だと思う(言い訳)
758デフォルトの名無しさん
2021/11/17(水) 18:52:13.63ID:80lHh4r4759デフォルトの名無しさん
2021/11/17(水) 20:15:51.70ID:ZRqEMafB せめてベースの.NETと同じ方針にしてくり
760デフォルトの名無しさん
2021/11/20(土) 14:03:27.82ID:mhCLQeY0 copy-itemでフォルダコピーする際、
サブディレクトリにあるフォルダ名やファイル名に特定の文字列 @("*hoge*","*huga*")
が含まれている場合除外したいのですが、
一通りググった方法を試しても上手くいきません。
get-childitemの有無等幾つか方法はあるみたいですが、どうやっても除外ができない。
上手くいく方法をご存知でしたら教えて頂けませんか。
サブディレクトリにあるフォルダ名やファイル名に特定の文字列 @("*hoge*","*huga*")
が含まれている場合除外したいのですが、
一通りググった方法を試しても上手くいきません。
get-childitemの有無等幾つか方法はあるみたいですが、どうやっても除外ができない。
上手くいく方法をご存知でしたら教えて頂けませんか。
761デフォルトの名無しさん
2021/11/20(土) 14:19:09.90ID:brX6qPUI robocopyを使う
762デフォルトの名無しさん
2021/11/20(土) 14:29:08.15ID:foKEgqXu >>760
Get-ChildItemでファイル列挙して正規表現かなんかでコピー対象のファイルなのか一個ずつ判定して一個ずつCopy-Itemすりゃいいんじゃないの
Get-ChildItemでファイル列挙して正規表現かなんかでコピー対象のファイルなのか一個ずつ判定して一個ずつCopy-Itemすりゃいいんじゃないの
763デフォルトの名無しさん
2021/11/20(土) 14:39:59.37ID:ebQnhsZ6 除外より特定のに引っ掛ける方が楽じゃないか?
764デフォルトの名無しさん
2021/11/20(土) 16:27:45.77ID:7hjyIAPL765sage
2021/11/20(土) 17:01:16.86ID:KK9A6rpv >>760
以下みたいな感じでGet-ChildItemの出力にWhere-Objectに-notlikeでフィルタしてCopy-itemすればいい
-Recurse付けたがサブディレクトリ含めなければ外せばいい
Get-ChildItemとWhere-Objectを組み合わせてググれば他の活用も見つかるはず
Get-ChildItem -Recurse|
Where-Object {$_.Name -notlike "*foo*" -and $_.Name -notlike "*bar*"} |
ForEach-Object {Copy-Item $_.Fullname -Destination "出力先フォルダ" -Recurse}
以下みたいな感じでGet-ChildItemの出力にWhere-Objectに-notlikeでフィルタしてCopy-itemすればいい
-Recurse付けたがサブディレクトリ含めなければ外せばいい
Get-ChildItemとWhere-Objectを組み合わせてググれば他の活用も見つかるはず
Get-ChildItem -Recurse|
Where-Object {$_.Name -notlike "*foo*" -and $_.Name -notlike "*bar*"} |
ForEach-Object {Copy-Item $_.Fullname -Destination "出力先フォルダ" -Recurse}
766sage
2021/11/20(土) 17:24:30.70ID:KK9A6rpv767デフォルトの名無しさん
2021/11/20(土) 17:29:07.00ID:mhCLQeY0 皆様ありがとうございます。
頂いたアドバイスを受けて、正規表現を使ったりして試しているところです。
解決したら改めて報告します。
ちなみに要件としては、
「起点のフォルダを再起的に全てコピー(同じ階層構造)」となります。
頂いたアドバイスを受けて、正規表現を使ったりして試しているところです。
解決したら改めて報告します。
ちなみに要件としては、
「起点のフォルダを再起的に全てコピー(同じ階層構造)」となります。
768デフォルトの名無しさん
2021/11/20(土) 17:35:03.97ID:mhCLQeY0 すみません、「起点のフォルダ以下を再起的に」ですね。
769デフォルトの名無しさん
2021/11/20(土) 18:08:26.07ID:tZNHbLNh >「起点のフォルダを再起的に全てコピー(同じ階層構造)」
パイプを繋げていくとこの点が不安になってくる。
コピー元のフルパスを正規表現で整形すれば良いだけだけど、何だかなって気分になる。
powershellが管理用途を目指したなら何でrobocopy相当の機能を提供しなかったんだろうか。
パイプを繋げていくとこの点が不安になってくる。
コピー元のフルパスを正規表現で整形すれば良いだけだけど、何だかなって気分になる。
powershellが管理用途を目指したなら何でrobocopy相当の機能を提供しなかったんだろうか。
770sage
2021/11/20(土) 18:22:44.14ID:KK9A6rpv 起点のパスからパイプつなげて階層コピーとかやろうとすると大変なのね
Get-ChildItemだと起点パスからの相対パスが出てこないからこんな汚いコードしか作れなかったわ
Push-Location "コピー元パス"
Get-ChildItem -Recurse|
Where-Object {$_.Name -notlike "*foo*"} |
Where-Object {$_.Name -notlike "*bar*"} |
ForEach-Object {Copy-Item $_.FullName -Destination ("コピー先パス"+(Resolve-Path $_.FullName -Relative))}
Get-ChildItemだと起点パスからの相対パスが出てこないからこんな汚いコードしか作れなかったわ
Push-Location "コピー元パス"
Get-ChildItem -Recurse|
Where-Object {$_.Name -notlike "*foo*"} |
Where-Object {$_.Name -notlike "*bar*"} |
ForEach-Object {Copy-Item $_.FullName -Destination ("コピー先パス"+(Resolve-Path $_.FullName -Relative))}
771デフォルトの名無しさん
2021/11/20(土) 19:23:56.73ID:ytLaGTl4 robocopyで十分ならrobocopy使うべき
772デフォルトの名無しさん
2021/11/20(土) 19:24:28.43ID:ytLaGTl4 マルチスレッドで速いし
773デフォルトの名無しさん
2021/11/20(土) 19:29:39.45ID:7hjyIAPL https://stackoverflow.com/questions/32101358/copy-all-files-and-folders-except-few-in-ruby
Ruby では、Dir.glob("**/*") で再帰的に、起点フォルダ以下のすべてのファイルを配列に入れて、
そこから、コピーしないファイルを削除する
そして、再帰的にコピーする
FileUtils.cp_r( 配列, destination_folder )
Ruby では、Dir.glob("**/*") で再帰的に、起点フォルダ以下のすべてのファイルを配列に入れて、
そこから、コピーしないファイルを削除する
そして、再帰的にコピーする
FileUtils.cp_r( 配列, destination_folder )
774デフォルトの名無しさん
2021/11/20(土) 21:10:31.67ID:ytLaGTl4 powershellでやるなら、一旦、まるっとコピーして、コピー先から不要なファイル消すのが簡単
775デフォルトの名無しさん
2021/11/20(土) 22:41:40.55ID:foKEgqXu 面白そうだから作ってみた
.NETクラス使ったら負けというポリシーの人には受け入れられないかもしれんが
$SrcPath #コピー元
$DstPath #コピー先
[System.IO.Directory]::EnumerateFiles($SrcPath, "*", [System.IO.SearchOption]::AllDirectories) |
Where-Object { $_ -notlike "*foo*" } |
Where-Object { $_ -notlike "*bar*"} |
Select-Object @{Name = "FPath"; Expression = {$_} }, @{Name = "RPath"; Expression = {$_.SubString($SrcPath.Length)}} |
ForEach-Object { `
[System.IO.Directory]::CreateDirectory(([System.IO.Path]::GetDirectoryName($DstPath + $_.RPath))) | Out-Null; `
Copy-Item $_.FPath -Destination ($DstPath + $_.RPath) `
}
.NETクラス使ったら負けというポリシーの人には受け入れられないかもしれんが
$SrcPath #コピー元
$DstPath #コピー先
[System.IO.Directory]::EnumerateFiles($SrcPath, "*", [System.IO.SearchOption]::AllDirectories) |
Where-Object { $_ -notlike "*foo*" } |
Where-Object { $_ -notlike "*bar*"} |
Select-Object @{Name = "FPath"; Expression = {$_} }, @{Name = "RPath"; Expression = {$_.SubString($SrcPath.Length)}} |
ForEach-Object { `
[System.IO.Directory]::CreateDirectory(([System.IO.Path]::GetDirectoryName($DstPath + $_.RPath))) | Out-Null; `
Copy-Item $_.FPath -Destination ($DstPath + $_.RPath) `
}
776デフォルトの名無しさん
2021/11/21(日) 09:11:58.65ID:mz7l6eLz777デフォルトの名無しさん
2021/11/21(日) 10:22:51.55ID:GghqNAbU .NETクラス使える俺スゲー君なんだろ
まあ $DstPath + $_.RPath なんて書いてるから中途半端な知識しかなさそうだけど
まあ $DstPath + $_.RPath なんて書いてるから中途半端な知識しかなさそうだけど
778デフォルトの名無しさん
2021/11/21(日) 13:09:01.33ID:03fh42bF >>777
Path.Combine使ってほしかったってこと?
Path.Combine使ってほしかったってこと?
779デフォルトの名無しさん
2021/11/21(日) 13:14:19.30ID:03fh42bF >>776
コピー先のフォルダーがあらかじめ作成されなくてもエラーにならないこと
コピー先のフォルダーがあらかじめ作成されなくてもエラーにならないこと
780デフォルトの名無しさん
2021/11/21(日) 14:06:02.04ID:/SaMuAE1 フォルダ名のファイルがあったらエラーになると思うけど
781デフォルトの名無しさん
2021/11/21(日) 14:12:17.11ID:03fh42bF >>780
それはエラーで正しい
それはエラーで正しい
782デフォルトの名無しさん
2021/11/21(日) 15:37:22.85ID:rt6j8p0A どうでもいいけど -notmatch 'foo|bar' でよくね
783デフォルトの名無しさん
2021/11/21(日) 23:12:49.29ID:ny8+2EkL 先日の質問者です。
下記コードで、想定通りの動作を確認しました。
事前に展開するディレクトリを作成する必要はありますが、
正規表現で抽出して、「Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)」で
展開先ディレクトリに取得した要素を展開する感じです。
色々とアドバイス頂きありがとうございました。
---------------------------------------------------------------------------------
#出力先ディレクトリ
$SrcPath = 任意のディレクトリ
#出力先ディレクトリ(スクリプトの置き場 + 展開するディレクトリ)
$DstPath = Join-Path (Split-Path $MyInvocation.MyCommand.path) ("\test")
#抽出&コピー
Get-ChildItem -Recurse $SrcPath | ?{ $_.FullName -match "^(?!.*file)"} | `
Copy-Item -Destination {Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)}
下記コードで、想定通りの動作を確認しました。
事前に展開するディレクトリを作成する必要はありますが、
正規表現で抽出して、「Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)」で
展開先ディレクトリに取得した要素を展開する感じです。
色々とアドバイス頂きありがとうございました。
---------------------------------------------------------------------------------
#出力先ディレクトリ
$SrcPath = 任意のディレクトリ
#出力先ディレクトリ(スクリプトの置き場 + 展開するディレクトリ)
$DstPath = Join-Path (Split-Path $MyInvocation.MyCommand.path) ("\test")
#抽出&コピー
Get-ChildItem -Recurse $SrcPath | ?{ $_.FullName -match "^(?!.*file)"} | `
Copy-Item -Destination {Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)}
784デフォルトの名無しさん
2021/11/21(日) 23:14:57.70ID:ny8+2EkL 誤字が酷い・・・
以下の通り訂正します。
#コピー元ディレクトリ
$SrcPath = 任意のディレクトリ
以下の通り訂正します。
#コピー元ディレクトリ
$SrcPath = 任意のディレクトリ
785デフォルトの名無しさん
2021/11/22(月) 01:24:51.37ID:DJE+GLbt 除外するのがファイルなら、全部コピーしてから消す方が、考える時間ノータイムでできるから、自分ならそうしちゃうな
ディレクトリ除外するなら素直にrobocopy使っちゃう
ディレクトリ除外するなら素直にrobocopy使っちゃう
786デフォルトの名無しさん
2021/11/22(月) 02:13:30.35ID:l3U7Q7kM 除外する理由も不明で全部コピーとか機械オンチかな
ストレージは有限リソースだぞ
ストレージは有限リソースだぞ
787デフォルトの名無しさん
2021/11/22(月) 02:45:11.19ID:49bPrPzL Join-Pathのところ
$_.Fullname.replace($SrcPath,$DstPath)
でもよさそう
$_.Fullname.replace($SrcPath,$DstPath)
でもよさそう
788デフォルトの名無しさん
2021/11/22(月) 04:31:54.22ID:y2hovgGl 除外したいファイルが巨大ファイルかもしれないのに一旦コピーしてから削除とかアホやろ
789デフォルトの名無しさん
2021/11/22(月) 10:05:58.61ID:xI4p9npJ 巨大ファイルかもしれないし小さいファイルかもしれない
質問者がまだ開示してない範囲なのでアイデアは言うだけタダだし叩くいわれもないだろう
質問者がまだ開示してない範囲なのでアイデアは言うだけタダだし叩くいわれもないだろう
790デフォルトの名無しさん
2021/11/22(月) 10:12:16.38ID:xI4p9npJ せっかく何でも呼べるシェルなのにrobocopyを呼ばない理由があるのかは知らん
純PSを使いたいという拘りは遊びや向学の範囲ならありだと思うけど
純PSを使いたいという拘りは遊びや向学の範囲ならありだと思うけど
791デフォルトの名無しさん
2021/11/22(月) 10:58:52.55ID:ssU9K32s 流石にコピーしてから削除は素人くさくて人には見せられないコードだな
792デフォルトの名無しさん
2021/11/22(月) 11:21:13.08ID:JeDQJ1PF 対象のファイル存在判定判定を行いたいんだけど
get-childitemで「〜が存在しない為検出できません」と表示されてFalseが返ってくる時と、対象ファイルはないけど何も表示されずにTrueが返ってくる時の違いって何でしょうか?
正規表現で複数のファイルを探してる時と限定して一つを探してる時の差って認識で合ってますでしょうか
認識が合ってるのであれば、Falseが返ってくる際のファイル存在判定ってどうやって行ったらいいですかね
get-childitemで「〜が存在しない為検出できません」と表示されてFalseが返ってくる時と、対象ファイルはないけど何も表示されずにTrueが返ってくる時の違いって何でしょうか?
正規表現で複数のファイルを探してる時と限定して一つを探してる時の差って認識で合ってますでしょうか
認識が合ってるのであれば、Falseが返ってくる際のファイル存在判定ってどうやって行ったらいいですかね
793デフォルトの名無しさん
2021/11/22(月) 11:32:08.25ID:y2hovgGl >>792
Test-Path
Test-Path
794デフォルトの名無しさん
2021/11/22(月) 11:57:50.46ID:vpaN3qMO robocopyという既存で使えるコマンドがあることはわかりました。
しかし、それを承知の上で、純PowerShellのコマンドで実現できる方法を探していました。
ストレージにも容量があるため、抽出とコピーを同時に済ませたかった次第です。
しかし、それを承知の上で、純PowerShellのコマンドで実現できる方法を探していました。
ストレージにも容量があるため、抽出とコピーを同時に済ませたかった次第です。
795デフォルトの名無しさん
2021/11/22(月) 12:33:14.41ID:DJE+GLbt あ、やっぱスクリプト書くのが目的なんですね
それならそれでよいと思います
ぱぱっと仕事を済ませるために使えるものを使うのであれば
そういう考え方もあるってことで
もちろん、コピー不要なファイルのサイズが大きすぎたりしたときは使えませんが
ただ、エラー時のリトライとかマルチスレッドをpowershellで実装するのは面倒なのでrobocopyかrsync使うことをお勧めします
自分しかアクセスしない領域を扱うなら、ここに書かれていた例でも十分かと思います
それならそれでよいと思います
ぱぱっと仕事を済ませるために使えるものを使うのであれば
そういう考え方もあるってことで
もちろん、コピー不要なファイルのサイズが大きすぎたりしたときは使えませんが
ただ、エラー時のリトライとかマルチスレッドをpowershellで実装するのは面倒なのでrobocopyかrsync使うことをお勧めします
自分しかアクセスしない領域を扱うなら、ここに書かれていた例でも十分かと思います
796デフォルトの名無しさん
2021/11/22(月) 12:46:04.31ID:JeDQJ1PF >>793
test-pathって複数ファイル判定できるのか?
test-pathって複数ファイル判定できるのか?
797デフォルトの名無しさん
2021/11/22(月) 13:07:04.73ID:DJE+GLbt test-pathはstring[]を引数に取れて、それぞれの判定結果を返しますね
798デフォルトの名無しさん
2021/11/22(月) 13:52:50.70ID:jUHFyU9k >>791
SSDを殺すツールでも作るのかね?
SSDを殺すツールでも作るのかね?
799デフォルトの名無しさん
2021/11/22(月) 20:21:46.68ID:nGTeQ/fQ 仕事で使うならrobocopyだな
800デフォルトの名無しさん
2021/11/22(月) 22:15:42.91ID:EOO8UMxm 今回の目的だとRobocopyで良いんだが
Powershellなら複数の条件のandでフィルターしたり正規表現でのフィルターやらリネームしながらのコピーとか活用シーンはあるわ
Powershellなら複数の条件のandでフィルターしたり正規表現でのフィルターやらリネームしながらのコピーとか活用シーンはあるわ
801デフォルトの名無しさん
2021/11/23(火) 00:34:07.96ID:co/a4Nbp >>787
大文字小文字の差異が発生したときにちゃんと動かないと思う
大文字小文字の差異が発生したときにちゃんと動かないと思う
802デフォルトの名無しさん
2021/11/23(火) 17:04:45.84ID:d0x80b5K じゃあ -reprace 演算子で
803デフォルトの名無しさん
2021/11/23(火) 20:11:06.49ID:LL+Lkvmb せめて-creplaceと書いとけ
804デフォルトの名無しさん
2021/11/23(火) 21:13:38.28ID:td4eh3RA Copy-Itemって時刻や属性とかACLやらもコピーされるんかな
同じにしといてや
同じにしといてや
805デフォルトの名無しさん
2021/11/23(火) 21:15:13.83ID:d0x80b5K >>803
大文字と小文字の差を無視したいんじゃないの?
大文字と小文字の差を無視したいんじゃないの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★5 [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★4 [BFU★]
- 小野田氏、”中国経済への依存“に警戒感 高市首相の国会答弁巡り [煮卵★]
- 高市政権にパイプ役不在…日中高まる緊張 公明党の連立離脱影響、自民内にも懸念「自分でまいた種は自分で刈り取ってもらわないと」★2 [ぐれ★]
- 【こんなの初めて…】民泊には既にキャンセルも 中国の渡航自粛で [ぐれ★]
- 日本が「世界で最も魅力的な国」1位に!✨「魅力的な都市」では東京が2位 「魅力的な地域」は北海道が7位に [煮卵★]
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 資さんうどんとかいいから「290円博多ラーメン膳」を全国展開しろよ。高市物価の反逆者だろ [153490809]
- 石破当時首相「高市を首相にしたら日中関係ぶち壊される、台湾有事を避ける為に米中には自分が話を付けたい」これネトウヨは笑うらしいな [152212454]
- 日経平均、49000円割れ 国賊高市を許すな [402859164]
- 日本人「気分はもう戦争」 [667744927]
- 日本が社会保障で財政破綻すれば政治家の責任、戦争で敗戦すれば国民とマスコミの責任 [633746646]
