[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『最下層のフォルダー名¥ファイル名の形式で1行に書き出す - 2』(Black)
スキル不足で以下の質問で挫折してました。
https://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi
希望の処理のイメージと近い、以下のURLのコードを参考に下記のようなコードを利用する事にしました。
https://kokodane.com/macro_55m.htm
(コードは、標準モジュールに記載)
Sheet1のE1に検索するHDDとして「x:\」を書き込んで
CmdSerch_Click()を呼び出しました。
順調にファイル名や親フォルダーなど書き出しできていましたが
64032行目を書き出し後に
以下のコードで実行エラー'70
「書き込みが出来ません」となり停止してしまいます。
どんな原因が考えられるでしょうか ?
For Each ObjFile In ObjFolder.Files
Option Explicit
’再帰呼び出し
Public Sub FileShow(StrPath, i)
Dim ObjFso As Object, ObjFolder As Object, ObjFile As Object
Dim ObjSub As Object, Ws As Worksheet
Set Ws = ThisWorkbook.Worksheets("sheet1")
Set ObjFso = CreateObject("scripting.FileSystemobject")
Set ObjFolder = ObjFso.GetFolder(StrPath)
For Each ObjFile In ObjFolder.Files
Ws.Cells(i, 2) = ObjFso.getbasename(ObjFile.Path) Ws.Cells(i, 3) = ObjFile.parentfolder.Path Ws.Cells(i, 4) = Int(ObjFile.Size / 1024) Ws.Cells(i, 5) = ObjFile.Type 'Ws.Cells(i, 6) = ObjFile.datecreated 'Ws.Cells(i, 7) = ObjFile.datelastaccessed 'Ws.Cells(i, 8) = ObjFile.datelastmodified i = i + 1 Next
For Each ObjSub In ObjFolder.SubFolders
FileShow ObjSub.Path, i Next
End Sub
’−−−−−−−−−−−−−−−−−−−−−−−−−−−−
'ファイル検索書き出し
Private Sub CmdSerch_Click()
Dim StrPath As String, i As Long
'サーチHDDのパスを指定
StrPath = Range("E1").Value
’書き出し開始レンジ指定
Range("A3").Select
i = 3
FileShow StrPath, i
End Sub
’−−−−−−−−−−−−−−−−−−−−−
'書き出したレンジをクリアー
Sub CLer()
Range("A3", ActiveCell.SpecialCells(xlLastCell)).ClearContents
End Sub
Excel2021
Windows11 22H2 X64
< 使用 Excel:unknown、使用 OS:unknown >
< 使用 Excel:unknown、使用 OS:unknown >
バージョンをお書きください。 今回の質問では特に重要な情報になりそうです。 (MK) 2022/10/25(火) 13:59:29
あと、マクロを記述してあるブックの拡張子も 書いてください。 (MK) 2022/10/25(火) 14:00:46
参考まで。
https://office-hack.com/excel/maximum-number-of-lines/
あと、変数iの宣言がされてませんが、変数の型はどうなってますか? (MK) 2022/10/25(火) 14:03:43
参考まで。
https://www.tech-teacher.jp/blog/vba-integer/
(MK) 2022/10/25(火) 14:04:55
Excel2021
Windows11 22H2 X64
と記載してもうまく表示されないので
[20221025134710]の記事の一番最後に
別途に記載していますが ?
Excel2021
Windows11 22H2 X64
>マクロを記述してあるブックの拡張子も
xlsmです。
変数iの宣言がされてませんが
Private Sub CmdSerch_Click()で
dim i as Long と宣言していますが ?
(Black) 2022/10/25(火) 14:26:07
特殊フォルダのファイルサイズの取得に失敗しているのだとおもいます。
私の環境では、$RECYCLE.BIN フォルダのサイズの取得でエラーが発生しました また $RECYCLE.BIN フォルダ以下のファイルでもエラーです
検索すると、JUNCTIONフォルダでうまくいかないという情報も見受けられました
それと別の話ですが、FileShowの中で、毎回 FileSystemObjectをCreateしてますが、 再帰の深さによっては恐ろしい数のオブジェクトが出来てしまいます
Folderオブジェクトだけ渡すようにすればいいとおもいます (´・ω・`) 2022/10/25(火) 14:47:45
>[20221025134710]の記事の一番最後に >別途に記載していますが ?
手を抜かずにこの質問に書くべきですね。
>Private Sub CmdSerch_Click()で >dim i as Long と宣言していますが ?
↓は?
Public Sub FileShow(StrPath, i)
省略するとVariant型になりますよ。
なんか回答者に対してけんか腰の ようですので回答はここまでとします。
(MK) 2022/10/25(火) 14:55:49
こんなことするとエラーになります
Sub test() Dim FSO As Object, Fld As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Fld = FSO.GetFolder("C:\$RECYCLE.BIN") Debug.Print Fld.Name ' OK Debug.Print Fld.Size ' エラー70 書き込み出来ません End Sub
Blackさんがエラーを起こしているのが C:\$RECYCLE.BIN とは限りませんので、 エラーが発生しているのがシステムフォルダや隠しフォルダではないか確認してみてはどうでしょう (´・ω・`) 2022/10/25(火) 14:59:49
>特殊フォルダのファイルサイズの取得に失敗しているのだとおもいます。
>私の環境では、$RECYCLE.BIN フォルダのサイズの取得でエラーが発生しました
調べてみると私の場合も、同じく
objFolder = x:\$RECYCLE.BIN\new_oneでエラーが出ていました。
これを防ぐ方法はありますか ?
>再帰の深さによっては恐ろしい数のオブジェクトが出来てしまいます
>Folderオブジェクトだけ渡すようにすればいいとおもいます
解説サイト(URL)のコードをそのまま利用せせていただいています。
具体的にはコードをどのように変更すれば良いでしょうか ?
>JUNCTIONフォルダでうまくいかないという情報も見受けられました
「JUNCTIONフォルダ」?
スキル不足でJUNCTIONフォルダーの意味が判りません。
JUNCTIONフォルダーとはどんなフォルダーでしょうか ?
不具合が発生するのであれば回避策はありますか ?
(Black) 2022/10/25(火) 15:11:44
サイズを取得しないようにすればいいのでは? 必要なのはフォルダ名とファイル名だけでしたよね?
FileSystemオブジェクトの数は、最初ねずみ算で増えてくような気がしましたが、 順次解放されるので 気にしなくていいようです
考えてみれば、フォルダの深さはファイル名の長さで上限が決まるので、 それほど大きな数にならないですね。失礼しました。 (´・ω・`) 2022/10/25(火) 16:18:52
>サイズを取得しないようにすればいいのでは?
>必要なのはフォルダ名とファイル名だけでしたよね?
おっしゃるようにファイルサイズは必要ないので
以下のコードをコメントアウトしたのですが同じ箇所で同じエラーが発生します。
'Ws.Cells(i, 4) = Int(ObjFile.Size / 1024)
考え方が間違っていますか ?
(Black) 2022/10/25(火) 16:47:15
'Ws.Cells(i, 5) = ObjFile.Type
(Black) 2022/10/25(火) 16:54:30
あ、そうか、エラーの出るフォルダの中にはいっていくとFolder.Filesでエラーなんですね
エラーが出たら、それ以上深掘り市内方向で これで必要な情報が得られてるのかどうかは知りませんけど
Sub sample() Dim FSO As FileSystemObject Dim fld As Folder Dim iRow As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fld = FSO.GetFolder("C:\$RECYCLE.BIN") iRow = 1 ListFiles fld, iRow
End Sub
Sub ListFiles(fld As Folder, ByRef iRow As Long) Dim f As File, subfld As Folder On Error GoTo Err_Exit For Each f In fld.Files Cells(iRow, 1).Value = f.ParentFolder & "\" & f.Name iRow = iRow + 1 Next For Each subfld In fld.SubFolders ListFiles subfld, iRow Next Err_Exit: End Sub (´・ω・`) 2022/10/25(火) 17:06:35
市内→しない (´・ω・`) 2022/10/25(火) 17:07:08
Attributesプロパティ調べて、やばそうなフォルダやファイルは相手にしないようにした方がいいかもしれません
Folderオブジェクト - Attributesプロパティ http://officetanaka.net/excel/vba/filesystemobject/folder01.htm (´・ω・`) 2022/10/25(火) 17:11:14
よくよく考えてみれば
For Each ObjFile In ObjFolder.Files で
ObjFolderがx:\$RECYCLE.BINになった時点でエラーが出ているので
それから先のコードをコメントアウトしても無駄な努力でした。
(objFolder.Filesは、x:\$RECYCLE.BIN\new_one)
2022/10/25(火) 17:06:35でいただいたコードを試してみたのですが
sample()を起動させても
Sub ListFiles(fld As Folder, ByRef iRow As Long)の行で
コンパイルエラー;ユーザー定義型は定義されていません。
のエラーがすぐに出て何も必要な情報が得られません。
何か勘違いをしているのでしょうか?
検査対象のドライブはX:ですが
Set fld = FSO.GetFolder("C:\$RECYCLE.BIN")で C:\となっていますが問題ないのでしょうか?
>Attributesプロパティ調べて
これは、
17:06:35で提示されたコードとは又別の案件でしょうか?
(Black) 2022/10/25(火) 18:48:48
すんません こちらで Sub sample() Dim FSO As Object Dim fld As Object Dim iRow As Long Set FSO = CreateObject("Scripting.FileSystemObject") Set fld = FSO.GetFolder("C:\$RECYCLE.BIN") iRow = 1 ListFiles fld, iRow End Sub Sub ListFiles(fld As Folder, ByRef iRow As Long) Dim f As Object, subfld As Object On Error GoTo Err_Exit For Each f In fld.Files Cells(iRow, 1).Value = f.ParentFolder & "\" & f.Name iRow = iRow + 1 Next For Each subfld In fld.SubFolders ListFiles subfld, iRow Next Err_Exit: End Sub (´・ω・`) 2022/10/25(火) 18:54:44
>別の案件で それは別案です
さらに別案でゴミ箱を空にしてから実行するというやり方もありかも
さらに別案でパワークエリもありかも (´・ω・`) 2022/10/25(火) 18:59:37
Option Explicit
Sub test() Dim wsh As Object, fdg As FileDialog Dim pSrc As String, pDst As String Dim plcy As String, cmd As String
Set wsh = CreateObject("wscript.shell") Set fdg = Application.FileDialog(msoFileDialogFolderPicker) If Not fdg.Show Then Exit Sub
pSrc = "'" & fdg.SelectedItems(1) & "\*'" pDst = "'" & wsh.specialfolders("desktop") & "\結果.txt'"
plcy = "-ExecutionPolicy RemoteSigned" cmd = "Get-ChildItem " & pSrc & " -recurse -File | " & _ "ForEach-Object {" & _ "$p =($_.directory).name ;" & _ "if ( -not $p.endswith('\')){ $p = $p + '\' } ;" & _ "$p + $_.name }" & " | " & _ "out-file -FilePath " & pDst
wsh.Run "powershell " & plcy & " -Command " & cmd, 0, True
MsgBox "完了"
End Sub
(マナ) 2022/10/25(火) 19:56:42
ごめんなさい Sub ListFiles(fld As Object, ByRef iRow As Long) ↑ ここも (´・ω・`) 2022/10/26(水) 06:33:10
スキン不足で理解が追いついていません。
新しいsample()コードの検証を始めたいと思います。
少し時間をください。
'---------------
>別案でゴミ箱を空にしてから実行するというやり方もありかも
デスクトップ上のゴミ箱に何も入っていない状況で
CmdSerch_Click()は同じコードで同じエラーは出します。
その時の、objFolderは前回と同じ以下の値で変化は有りません。
objFolder = x:\$RECYCLE.BIN\new_one
X:\調べてみると以下の隠しフォルダーは存在するようです。
x:\$RECYCLE.BIN\new_one
以下のURLを見ると
https://www.dot-plus.com/pc/windows/2825/
URLには以下のように書かれていますが
「ゴミ箱のデータを完全に削除すると、[$Recycle.Bin]の中のデータも削除されます」。
試しにx:\$RECYCLE.BIN\new_oneのサイズが0Byteの時に
100MBのファイルを削除して、ゴミ箱に移動させて
ゴミ箱から100MBのファイルを削除してもx:\$RECYCLE.BINのサイズは100MBのままです。
URLとは、違う結果になった。
隠しフォルダーのx:\$RECYCLE.BINをファイルエディターで削除する事は
出来そうですが、´・ω・`さんの言う「別案でゴミ箱を空にして」とは
ファイルエディターで削除する事でしょうか ?
([$RECYCLE.BIN]自体は、エクスプローラを閉じて、再度起動すると復活するようなので
ファイルエディターで削除も選択肢になりそうですがご意見を伺わせてください。)
'------------------------------
マナさん、PowerShellでの回答ありがとうございます。
PowerShellは、使ったことが無いので手探りで始めてみます。
検証できるまで時間が必要です。
少し時間をください。
(Black) 2022/10/26(水) 08:28:30
ゴミ箱を空にするのは、そのままの意味です $RECYCLE.BIN の削除はやめておいた方がいいんじゃないでしょうか (´・ω・`) 2022/10/26(水) 08:54:07
ゴミ箱の何も存在しない状態でsample()を実施すると
Sheetには47個のファイルがノミネートされました。
以下のようなフォルダーでファイルが異なる
C:\$Recycle.Bin\S-1-5-21-2603508113-175021221-4031538670-1001\$I2R94GJ.txt
但し、エキスプローラー(ファイルエディター)で
C:\$Recycle.Bin を表示させても
「このフォルダーは空です」と表示されます。
'------------------------
試しに、
Set fld = FSO.GetFolder("X:\$RECYCLE.BIN")
に変更してX:を出力させると10個のファイルがノミネートされました。
X:\$RECYCLE.BIN\new_One\MusicBeeLibrary.bak ----> New_One関連9個
X:\$RECYCLE.BIN\S-1-5-21-2603508113-175021221-4031538670-1001\desktop.ini ----> 1個
同じくエキスプローラー(ファイルエディター)で
X:\$Recycle.Bin を表示させると
new_One
が表示されて、サイズは100MBでした。
'---------------
ゴミ箱から削除した状態で
試しに外付けの同じような外付けの3つのドライブ(W,P,J)をチェックすると
エキスプローラー(ファイルエディター)で
\$Recycle.Bin を表示させると3つ共に
「このフォルダーは空です」と表示されます。
試しにPドライブにテキストファイルを保存後に削除(ゴミ箱に存在する状態)と
ゴミ箱から削除した状態で
エキスプローラー(ファイルエディター)で
P:\$Recycle.Bin を表示させてもどちらも
「このフォルダーは空です」と表示されます。
なぜか?
X:\$Recycle.Bin だけ表示内容が違っているようです。
この結果で何わかりますか ?
(Black) 2022/10/26(水) 09:09:24
わらりません すみませんが、ゴミ箱の中身ってそんなに気になります?
私は気にならないというか、気にしてもしょうがない(どうせ完全にはわからない)ので そこはおいておいて、エラーはOn Errorで無視して、先に進んだらいかがでしょう (´・ω・`) 2022/10/26(水) 09:13:32
>私は気にならないというか、気にしてもしょうがない(どうせ完全にはわからない)ので
>そこはおいておいて、エラーはOn Errorで無視して、先に進んだらいかがでしょう
確かにゴミ箱の中身を気にしても先に進めそうにないので
アドバイスに従って「On Error Resume Next」でエラーを無視して先に進むようにコードを追加しました。
(On Errorを使うようにアドバイスされていましたが
「On Error Resume Next」で良かったのか?戸惑いがあります。)
それと、処理中、いつ終わったのか良くわからないのでMSGコマンドを追加しました。
結果、エラーを無視しているので処理自体は最後行きました。
検証すると
X:¥の総ファイル数 64142
Private Sub CmdSerch_Click()で表示されたファイル数 64038
64142-64038=104個 --> エラーの為表示されなかったファイル数
但し、X:\$RECYCLE.BIN関連の10個のファイルはOn Error Resume Nextを追加したら
表示されるようになったので
この104個には$RECYCLE.BIN関連は含まれていません。
現時点で何かアドバイスできる有るでしょうか ?
以下現在のコードです。
Option Explicit
Public Sub FileShow(StrPath, i As Long)
Dim ObjFso As Object, objFolder As Object, ObjFile As Object
Dim ObjSub As Object, Ws As Worksheet
On Error Resume Next
Set Ws = ThisWorkbook.Worksheets("sheet1")
Set ObjFso = CreateObject("scripting.FileSystemobject")
Set objFolder = ObjFso.GetFolder(StrPath)
For Each ObjFile In objFolder.Files
Ws.Cells(i, 2) = ObjFso.getbasename(ObjFile.Path) Ws.Cells(i, 3) = ObjFile.ParentFolder.Path Ws.Cells(i, 4) = Int(ObjFile.Size / 1024) Ws.Cells(i, 5) = ObjFile.Type 'Ws.Cells(i, 6) = ObjFile.datecreated 'Ws.Cells(i, 7) = ObjFile.datelastaccessed 'Ws.Cells(i, 8) = ObjFile.datelastmodified i = i + 1 Next
For Each ObjSub In objFolder.SubFolders
FileShow ObjSub.Path, i Next
End Sub
Private Sub CmdSerch_Click()
Dim StrPath As String, i As Long
StrPath = Range("E1").Value
Range("A3").Select
i = 3
MsgBox "処理を開始します。"
FileShow StrPath, i
MsgBox "処理が終了しました."
End Sub
'------------------------------------
マナさん、PowerShell利用版のVBAを検証してみました。
6404個のファイルがTXTファイルに書き出されました。
上記の改訂版のコードで出力される64038($RECYCLE.BIN関連を除くと64028)と比較すると
10個ほど違いますが「システム情報ファイル」の差だと思われます。
(Black) 2022/10/26(水) 11:34:12
提示されたコードは、
Windowsセキュリティ(Defender)が反応してうまく処理できなかったので
Defenderのリアルタイム保護を一時的に無効にすることで
処理できました。
操作がブロックされました。
管理者の設定により、このアクションはWindowsセキュリティでブロックされました。
ヘルプデスクに問い合わせてください。
(Black) 2022/10/26(水) 12:28:18
・下記をメモ帳にコピペして適当な名前で保存 → 拡張子を ps1 に変更 ・アイコンを右クリック →「PowerShellで実行」
# https://buralog.jp/powershell-folderbrowserdialog/ # https://letspowershell.blogspot.com/2015/06/powershellmessagebox.html Add-Type -AssemblyName System.Windows.Forms $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
if ($FolderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){ $pSrc = $FolderBrowser.SelectedPath + "\*" $pDst = [System.Environment]::GetFolderPath("Desktop") + "\結果.txt" Get-ChildItem $pSrc -recurse -File | ForEach-Object { $p =($_.directory).name if ( -not $p.endswith("\")){ $p = $p + "\" } $p + $_.name $n = $n + 1 } | out-file -FilePath $pDst $msg = "完了`n" + [string]$n + "個みつかりました" [System.Windows.Forms.MessageBox]::Show($msg) }
(マナ) 2022/10/26(水) 22:57:38
(VBAでは、Defenderが過剰反応するのを止める事が出来ないのですね。)
指示に従って「HDD_List.ps1」をデスクトップに作成しました。
(テキスト形式は、UTF-8(BOM付き)を使用)
作成されたアイコンを右クリック →「PowerShellで実行」を行いましたが
一瞬、PowerShell画面が出ますが直ぐに消えてしましいます。
(VBAのようにフォルダー選択画面が出ません)
何か不都合な事が有って処理が進行していないようです。
私の方で手順等に不都合が有るのでしょうか?
アドバイスお願いしします。
'------------------------------------
なお、マナさんのコードをお借りしてVBAでは
以下のようにコード変更して使用しています。
PowerShell版で書き換えていただけると嬉しいです。
Option Explicit
Sub Mp3ドライブ出力() Dim wsh As Object, fdg As FileDialog Dim pSrc As String, Cdir As String, pDst As String Dim plcy As String, cmd As String
Set wsh = CreateObject("wscript.shell") Set fdg = Application.FileDialog(msoFileDialogFolderPicker)
MsgBox "サーチするドライブを指定してください。" If Not fdg.Show Then Exit Sub pSrc = "'" & fdg.SelectedItems(1) & "\*'" Cdir = Left(fdg.SelectedItems(1), 1) pDst = "'" & wsh.specialfolders("desktop") & "\結果.txt'" plcy = "-ExecutionPolicy RemoteSigned" cmd = "Get-ChildItem " & pSrc & " -recurse -File | " & _ "ForEach-Object {" & _ "$p =($_.directory).name ;" & _ "if ( -not $p.endswith('\')){ $p = $p + '\' } ;" & _ "$p + $_.name }" & " | " & _ "out-file -FilePath " & pDst MsgBox "指定ドライブをサーチしてファイルリストを作成します。" wsh.Run "powershell " & plcy & " -Command " & cmd, 0, True
Name "C:\Users\TAC_\Desktop\結果.txt" As "C:\Users\TAC_\Desktop\" & Cdir & "_Drive_List.txt"
MsgBox "ファイルリストがデスクトップに作成されました。"
End Sub
(Black) 2022/10/27(木) 04:43:50
# https://buralog.jp/powershell-folderbrowserdialog/ # https://letspowershell.blogspot.com/2015/06/powershellmessagebox.html Add-Type -AssemblyName System.Windows.Forms $msg = "指定ドライブをサーチしてファイルリストを作成します。`n" $msg = $msg + "サーチするドライブを指定してください。" $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{ Description = $msg }
if ($FolderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){ $pSrc = $FolderBrowser.SelectedPath + "\*" $pDst = [System.Environment]::GetFolderPath("Desktop") + "\" + $pSrc.Substring(0, 1) + "_Drive_List.txt" Get-ChildItem $pSrc -recurse -File | ForEach-Object { $p =($_.directory).name if ( -not $p.endswith("\")){ $p = $p + "\" } $p + $_.name } | out-file -FilePath $pDst $msg = "ファイルリストがデスクトップに作成されました。" [System.Windows.Forms.MessageBox]::Show("$msg") }
(マナ) 2022/10/27(木) 09:41:49
早速、改訂版のコードで試してみましたが
残念ながら前回と同じく
一瞬、PowerShell画面が出ますが直ぐに消えてしましいます。
(VBAのようにフォルダー選択画面が出ません)
どうも、私の環境が整っていないので作動していないのでは思い
コードの最初に記載されていた以下のURLを見てみました。
https://buralog.jp/powershell-folderbrowserdialog/
URLの記事内に
「NET FrameworkのSystem.Windows.Formsを読み込む」と有ったので
調べてみたら、
.NET Framework 4.8 は Windows 11 に含まれており、
.NET Framework 3.5 は別途インストールする必要が有るとの事でした。
(.NET Frameworkはバージョンの上位互換性が無い)
なので私のOS(Windows11 22H2 X64)に.NET Framework 3.5が無いのが
作動しない原因でしょうか ?
知らない状態で3.5をインストールするのも問題がありそうなので
踏ん切りが付きません。
(Black) 2022/10/27(木) 11:47:07
Add-Type -AssemblyName System.Windows.Forms $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog $FolderBrowser.ShowDialog()
(マナ) 2022/10/27(木) 13:16:33
マナさん、試してみました。
やはり、
一瞬、PowerShell画面が出ますが直ぐに消えてしましいます。
やはり、私の環境(PC)独自の問題のようですね。
(Black) 2022/10/27(木) 16:55:35
# https://letspowershell.blogspot.com/2015/06/powershellinputbox.html Add-Type -AssemblyName Microsoft.VisualBasic $msg = "指定ドライブをサーチしてファイルリストを作成します。`n" $msg = $msg + "サーチするドライブを指定してください。" #[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a") $INPUT = [Microsoft.VisualBasic.Interaction]::InputBox($msg)
if ($INPUT -ne "") { $pSrc = $INPUT + ":\*" $pDst = [System.Environment]::GetFolderPath("Desktop") + "\" + $pSrc.Substring(0, 1) + "_Drive_List.txt" Get-ChildItem $pSrc -recurse -File | ForEach-Object { $p =($_.directory).name if ( -not $p.endswith("\")){ $p = $p + "\" } $p + $_.name $n = $n + 1 } | out-file -FilePath $pDst if ($n -gt 0) { $msg = "ファイルリストがデスクトップに作成されました。" [Microsoft.VisualBasic.Interaction]::MsgBox("$msg") } else { $msg = "ファイルがありませんでした。" [Microsoft.VisualBasic.Interaction]::MsgBox($msg) } }
(マナ) 2022/10/27(木) 19:31:09
読み取り権限すら所有していないフォルダの情報を読み取ることがそもそも無理な話なんですが。 OSの機能なんで読み取れたら判明した時点で修正対象になりそう。
PowerShell の話なんですが、PS1 ファイル実行前に必要な前提についての話はしてました? していたならこちらの見落としですのでスルーお願いします。
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scripts?view=powershell-7.2
何もしていない状態では、PS1 ファイルは実行することはできません。 実行ポリシーを変更するか、コマンドラインから ExecutionPolicy 起動オプションを指定する必要があります。
https://bags-lab.com/2020/11/01/powershell-bat-run/
自分で使う場合は一行にまとめて、PowerShell にスクリプトを文字列としてコマンドラインで渡して起動しますが。 (とりあえず書く) 2022/10/27(木) 19:55:01
とりあえず書くさん、興味を持っていただいてありがとうございます。
やはり、ps1を実行するにはPCの環境を事前に設定しておく
必要な条件(前提条件)が有るのですね。
早速、提示いただいたURLを参照してみました。
まず、PowerShellで以下のコマンドでPowerShell 実行ポリシーを変更する必要があるとのことで
Set-ExecutionPolicy AllSigned を管理者権限で実施しました。
「Y」を選択、エラーが無いので成功しているようです。(添付、参考画像参照ください)
次に、「スクリプトを実行するには、スクリプト ファイルの完全な名前と完全なパス」が必要との事なので
PowerShellでps1のフルパスを指定しましたがエラーがでました。(添付、添付画像参照ください)
やはり、PowerShellを利用するのは私には荷が重そうです。
参考画像
https://imgur.com/8CKAz6W
(Black) 2022/10/28(金) 09:14:38
最後に、こちらの実行結果を書いておきます。 ★環境(自宅と職場のPCで試しました) Windows1O PowerShell:ver 5.1 実行ポリシー:Restricted
★結果 1)PowerShellアプリ起動し、ps1のフルパスを入力し、Enter →エラー(メッセージ:このシステムはスクリプトの実行が無効になっているため…) 2)ps1のアイコンを右クリック/「編集」を選択でISEを起動し、「スクリプトの実行(F5)」 →1)と同じエラー 3)ps1のアイコンを右クリック/「PowerShellで実行」を選択で実行 →正常に実行される(フォルダ選択ダイアロクが開く) 上記の結果と、↓の記載から、今回は「PowerShellで実行」機能がおすすめかと考えた次第です。 https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_run_with_powershell?view=powershell-7.2 ただし、わたしもPowerShell初心者で、全くわかっていませんので 誤解があるかもしれません。
(マナ) 2022/10/28(金) 19:23:54
このMp3とはどういう意味でしょうか?
(マナ) 2022/10/28(金) 20:09:12
参考画像見ましたよ。 エラーメッセージに「デジタル署名」と表示されているので、 実行ポリシーが AllSigned (電子署名をすべてに要求) になっているのではないのでしょうか。
もう一つありますが、「ダウンロードしたスクリプトファイルを実行」なので違うでしょう。
実行ポリシーが AllSigned の場合、"PowerShell で実行" も影響を受けます。 マナさんのリンク先に書かれていますが、 > AllSigned 実行ポリシーがコンピューターまたはユーザーに対して有効な場合、"PowerShell で実行" は署名付きスクリプトのみを実行します。 > "PowerShell で実行" は、他の実行ポリシーの影響を受けません。 とのことです。
どこまで影響を受けるかわかりませんが、とりあえず。
Sub oneliner()
Dim PSScript As String: PSScript = Join(Array( _ "Add-Type -AssemblyName System.Windows.Forms", _ "$msg = '指定ドライブをサーチしてファイルリストを作成します。サーチするドライブを指定してください。' ", _ "$FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{ " & _ "Description = $msg", _ "}", _ "if ($FolderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){ " & _ "$pSrc = $FolderBrowser.SelectedPath + '\*'", _ "$pDst = [System.Environment]::GetFolderPath('Desktop') + '\' + $pSrc.Substring(0, 1) + '_Drive_List.txt'", _ "Get-ChildItem $pSrc -recurse -File | " & _ "ForEach-Object { " & _ "$p =($_.directory).name", _ "if ( -not $p.endswith('\')){ $p = $p + '\' }", _ "$p + $_.name", _ "} | " & _ "out-file -FilePath $pDst", _ "[System.Windows.Forms.MessageBox]::Show('ファイルリストがデスクトップに作成されました。')", _ "}"), ";" & "")
Dim CMDLine As String: CMDLine = "powershell """ & PSScript & """"
Debug.Print PSScript Debug.Print CMDLine
CreateObject("WScript.Shell").Run CMDLine
End Sub
> (マナ) 2022/10/27(木) 09:41:49 投稿分のコマンドライン実行版です。VBE に張り付けて実行してみてください。 これでもだめなら PowerShell 実行は無理なのかもしれません。
関係あるのかないのよくわからない話。 C ドライブでは空のファイルが作られました。外付け F ドライブでは時間がかかりますが出力されました。 (とりあえず書く) 2022/10/28(金) 20:55:40
とりあえずさん、見捨てずに 投稿分のコマンドライン実行版を書いていただきありがとうございます。
上手くいくか判りませんが、最後のつもりでTRYしてみます。
2022/10/25(火) 19:56:42のマナさんのPowerShell利用版のVBAは検証結果
上手くTXTファイルが出力されたのでとりあえずさんのVBA版も希望は持てると思っています。
>このMp3とはどういう意味でしょうか?
主ににMp3ファイルを集めたハードディスクの内容(ファイル名等)を出力させるためのVBAと言う意味で
「Sub Mp3ドライブ出力()」と命名しました。
MP3(エムピースリー、MPEG-1 Audio Layer-3の略)は、
音響データを圧縮する技術の1つであり、それから作られる音声ファイルフォーマット。
ファイルの拡張子は「.mp3」が一般的。
(所轄担当者) 2022/10/29(土) 06:34:32
#もっと速いpowershell
Set-Location -Path ([System.Environment]::GetFolderPath("Desktop")) $t=Get-Date $files=Get-ChildItem -Path C:\ -Recurse -File -ErrorAction SilentlyContinue #ここのpathを変える $sb=[System.Text.StringBuilder]::new() ((Get-Date)-$t).totalseconds
$t=Get-Date $sb=[System.Text.StringBuilder]::new() foreach ($f in $files) { $sb.AppendLine( #(i,5)のObjFile.Typeは取れなかった @("`"$($f.name)`"", "`"$($f.DirectoryName)`"", [System.Math]::Ceiling($f.length/1024).ToString(), "`"$($f.CreationTime)`"", "`"$($f.lastaccesstime)`"", "`"$($f.lastwritetime)`"") -join "," )>$null } $sb.ToString()|Out-File -Encoding default powershll_ga_kaita_tekisut.txt ((Get-Date)-$t).totalseconds
(通りすがり) 2022/10/29(土) 10:16:27
マナさんのPowerShell利用版のVBAと同じく
Windowsセキュリティ(Defender)が反応してうまく処理できなかったので
Defenderのリアルタイム保護を一時的に無効にすることで
エラーも無く処理できました。
(ファイルリストがデスクトップに作成されました。)
Defenderが過剰反応するので保護を一時無効にする作業が必要ですが
マナさんのPowerShell利用版のVBAと同じく利用させていただきます。
協力感謝いたします。
通りすがりさん、改良版(もっと速い)のPowerShell版のコードありがとうございます。
コードを「tourisugari.ps1」(文字コードutf-8 BOM付き)で保存して
提示いただいた以下のコードをPowerShell(管理者権限)で実行しましたが
2022/10/28 09:14:38 の参考画像と同じエラーが出ました。
powershell -File C:\Users\Mic\Desktop\tourisugari.ps1 -ExecutionPolicy RemoteSigned
私の環境では、PowerShellとの相性は良くないようで
PowerShell単独版でのリスト作成は諦めます。
(Black) 2022/10/29(土) 13:42:54
BOM無しでSAVEして以下どちらも試しましたが
結果は、同じエラーです。
powershell -File C:\Users\Mic\Desktop\tourisugari.ps1 -ExecutionPolicy RemoteSigned
powershell -File C:\Users\Mic\Desktop\tourisugari.ps1 set-executionPolicy remoteSigned
どちらも、PowerShellは管理者権限で実行しました。
(Black) 2022/10/29(土) 15:20:23
またはpowershell ISEというのをググって使い方を調べる
基本的にはコピペしてF5で動く。
powershell 動かないとかでググれば絶対情報あるよ
(通りすが) 2022/10/29(土) 16:19:08
少し、先が見えました。
1)PowerShellは管理者権限で実行
2)以下のコマンドを最初に実行
powershell set-executionPolicy remoteSigned
3)次に以下のコマンドを実行
powershell -File C:\Users\Mic\Desktop\tourisugari.ps1
結果、上手く処理できました。
アドバイスを受けて「PowerShell ISE」を起動させたら
PowerShell の起動画面と違って面食らいました。
「PowerShell ISE」で.ps1を起動させたほうが良いと言う理解でいいですか?
(PowerShellと両方追いかけるのではなく片方に絞ったほうが問題がなさそうなので)
それと
>基本的にはコピペしてF5で動く
ISEを起動して
スクリプト(2022/10/29 10:16:27 で記載されたコード ?)をコピペして
F5 キーをクリックしようと思いましたが、グレーアウトして押せませんでした。
基本的な事でしょうがアドバイスお願いします。
(Black) 2022/10/29(土) 17:10:23
単に数が多い場合、foreach-objectで回して、out-fileするより
foreachで回してStringBuilderでため込んで一気に書いたほうが5倍くらい
速かったと言いたかった(というかマウント取りに行った)だけなんで。
(通りすが) 2022/10/29(土) 17:28:03
了解しました。
モノになるか判りませんが頑張ってみます。
皆様お世話になりましたが、解決としたいと思います。
協力に感謝いたします。
(Black) 2022/10/30(日) 04:18:03
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.