2016-11-03 9 views
-2

sysinternalsのPsInfoを使用して、ドライブ情報をcsvの形式で返します。より読みやすくするためにcsvを解析する

このコマンドを実行するとします。

psinfo -c -d volume 

次の出力が表示されます。出力はスプレッドシートビューアによって読み取られたとき

PCNAME,, 
,,C:,Fixed,NTFS,,930.97 GB,705.81 GB,75.8% 
,,G:,Fixed,NTFS,My Book,1862.98 GB,889.71 GB,47.8%  

だから、それは読みやすく、整理表示されます。ここで

PCName,,C:,Fixed,NTFS,,930.97 GB,705.81 GB,75.8%,D:,CD-ROM,,,,,0.0%,G:,Fixed,NTFS,My Book,1862.98 GB,889.71 GB,47.8% 

私の目標は、このフォーマットを達成するためにその出力を解析することです。

ドライブ文字のビットと一致するようにregexを試してみましたが、正しく出力をキャプチャする方法がわかりません。

編集:(実際に私のコードを投稿するのを忘れていました...) これはこれまで私が行ったことです。

ECHO OFF 
For /f "tokens=1*" %%x in ('net view ^| find "\\"') do (psinfo %%x filter -d -c >> out.csv & echo. >> out.csv) 

::used to remove blanmk lines from output 
@jrepl "^[ \t]*(.*?)[ \t]*$" "$1?$1:false" /jmatch /f out.csv /o - 
pause 
+1

CSVは、各列の値を保持する必要があり、あなたの目標は、壊れたものです。 Excelのフィルタを使用して、必要なものをグループ化することができます。 – YOU

+0

Powershellには、Impor-CSVとExport-CSVという多くの文字列操作と解析関数があります。あなたはCSVを持っていません。あなたが望むものを得るためにpowershellコマンドを使うのはなぜですか? 'Get-Volume'を呼び出すだけです。 –

+0

psinfoを使ってネットワークからボリューム情報を収集するというアイディアでした。これはpowershellで可能ですか? – Solaris765

答えて

0

これは私に役立ちました。この例では、あなたが望む出力形式で遊ぶことができるはずです。ここ

"COCO","C:","Fixed","NTFS","","930.97 GB","705.81 GB","75.8%" 
"COCO","G:","Fixed","NTFS","My Book","1862.98 GB","889.71 GB","47.8%" 

そして

@echo off 

FOR /F "tokens=1* delims=," %%G IN ('psinfo -c -d volume') DO (
    SET "pcname=%%G" 
    SET "driveinfo=%%H" 
) 
set driveinfo="%driveinfo:,=","%" 

:LOOP 
FOR /F "tokens=1-7* delims=," %%G IN ("%driveinfo%") DO (
    echo "%pcname%",%%G,%%H,%%I,%%J,%%K,%%L,%%M 
    SET "driveinfo=%%N" 
) 
IF DEFINED driveinfo GOTO LOOP 

出力は、あなたの正確な必要な出力を複製するように変更コードです。

@echo off 

FOR /F "tokens=1* delims=," %%G IN ('psinfo -c -d volume') DO (
    SET "pcname=%%G" 
    SET "driveinfo=%%H" 
) 
set driveinfo="%driveinfo:,=","%" 
echo %pcname%,, 
:LOOP 
FOR /F "tokens=1-7* delims=," %%G IN ("%driveinfo%") DO (
    echo ,,%%~G,%%~H,%%~I,%%~J,%%~K,%%~L,%%~M 
    SET "driveinfo=%%N" 
) 
IF DEFINED driveinfo GOTO LOOP 

ここでは、いくつか少ない行で説明します。

@echo off 
setlocal enabledelayedexpansion 

FOR /F "tokens=1* delims=," %%G IN ('psinfo -c -d volume') DO (
    echo %%G,, 
    SET "driveinfo=%%H" 
) 
set "drive2=echo ,,!driveinfo:%%=%%&echo,,!" 
%drive2:~0,-1% 
+0

これをリレーショナルデータベースにインポートしていれば、これは私にとってはうまくいくでしょうが、探していたものではありません。私は@マゴーの答えは私が探していたラインに沿っていたと思う。私がこのようなことをする必要があるなら、私の心の後ろにこの解決策を残しておくつもりですが。 – Solaris765

+0

@ Solaris765では、コードがどのように動作するのかわからないことがわかりました。あなたは私があなたのために更新したあなたの質問の例のように、Magooの出力と同じように2つの小さな変更を加えて出力することができます。人々が解決策を求めていて、コードがどのように機能するかを気にしないときは、昨晩遅くまであなたの質問を最新の情報に更新した後、元の質問は完全に欠落していました。 – Squashman

+0

変更がどれほど簡単かを示す別のコードセットが追加されました。私も引用符を取り除いたが、私は引用符を保持することを好む。まだ私が仕事をしている場所では、引用符でDBに入力しても問題ありません。 – Squashman

0
@ECHO OFF 
SETLOCAL enabledelayedexpansion 
FOR /f "delims=" %%a IN ('psinfo -c -d volume') DO SET "var=%%a" 
SET "var2=!var:%%=\!" 
SET "retained=" 
:again 

REM FOR /f "tokens=delims==:" %%a IN() DO 
FOR /f "tokens=1*delims=:" %%a IN ("%var2%") DO (
CALL :FORMAT "%%a" 
SET "var2=%%b" 
IF NOT "%%b"=="" GOTO again 
) 

GOTO :EOF 

:FORMAT 
SET "data=%~1" 
IF "%data:~-1%"=="\" (SET "data=%retained%:%data%") ELSE (SET "data=%retained%:%data:~,-2%") 
IF DEFINED retained (
ECHO ,,!data:\=%%! 
) ELSE (
ECHO %data:~1%, 
) 
SET "retained=%~1" 
SET retained=%retained:~-1% 
GOTO :eof 

代替処理を容易にするために%ため\

+0

ああ、ありがとう。これは私が自分自身で思いついたものとはまったく同じです。以前はスペースを取り除くためにjrepl.batを使っていました。 – Solaris765

+0

'Get-Volume'はこの情報を行形式で直接返します。シンプルなPowershellコマンドを使用すると、追加の書式設定が非常に簡単になります。 –

0

Powershellで同じ情報を得ることができます(例:Get-Volumeコマンド)。

 
DriveLetter FileSystemLabel FileSystem DriveType HealthStatus OperationalStatus SizeRemaining  Size 
----------- --------------- ---------- --------- ------------ ----------------- -------------  ---- 
D          CD-ROM Healthy  Unknown      0 B  0 B 
C   Win7   NTFS  Fixed  Healthy  OK      43.59 GB 238.03 GB 
H   Projects  NTFS  Fixed  Healthy  OK      96.73 GB 375.24 GB 

Get-Volume戻っボリューム情報オブジェクト:これは、配給など以外のすべてを返します。シェルは最も一般的なシェルを表示します。

あなたが欲しいだけのプロパティを選択して、selectコマンドを使用して複数の列を追加することができます。

Get-Volume | where {$_.DriveType -ne 'CD-ROM'} 
      | select DriveLetter, FileSystemLabel,FileSystem,SizeRemaining, Size, 
        @{Name="Ratio";Expression={"{0:P}" -f ($_.SizeRemaining/$_.Size)}} 
      |Format-Table 
 
DriveLetter FileSystemLabel FileSystem SizeRemaining   Size Ratio 
----------- --------------- ---------- -------------   ---- ----- 
C   Win7   NTFS   46793633792 255584587776 18,31% 
H   Projects  NTFS  103853056000 402911129600 25,78% 

私はwhere

でCD-ROMをフィルタリングすることで、ここでは少し浮気しています

結果が長すぎてウィンドウに収まらない場合、Powershellはそれらを名前/値のリストとして表示します。

Get-Volume | where {$_.DriveType -ne 'CD-ROM'} 
      | select DriveLetter, FileSystemLabel,FileSystem,SizeRemaining, Size, 
        @{Name="Rate";Expression={"{0:P}" -f ($_.SizeRemaining/$_.Size)}} 
      |Format-Table > somefile.txt 

または私は実際のCSVファイルに結果をエクスポートすることができ:最終Format-Table

Iは、通常のリダイレクトでファイルにテーブルを格納することができるテーブルとして結果をフォーマットするPowerShellを強制するために使用されあなたが望むようExport-CSV

Get-Volume | where {$_.DriveType -ne 'CD-ROM'} 
      | select DriveLetter, FileSystemLabel,FileSystem,SizeRemaining, Size, 
        @{Name="Rate";Expression={"{0:P}" -f ($_.SizeRemaining/$_.Size)}} 
      | Export-CSV somefile.csv 
+0

うーん、おそらく、この目標を達成するためにpowershellが優れた選択肢でした。特に私はPsInfoなしで同じギャルを達成することができるように思えます。私がPowerShellに慣れていないので、ネットワーク上のすべてのコンピュータを反復することは可能でしょうか?このsiは私がPsInfoを試してみることを決めた主な理由です。 – Solaris765

+0

はい、 '-CIMSession'プロパティを使用します。これにより、一度に複数のマシンを照会することができます。またはWMIクエリを使用することができます[ここに示す](http://stackoverflow.com/questions/12159341/how-to-get-disk-capacity-and-free-space-of-remote-computer) –

+0

@ Solaris765 WMICを使用することもできます。また、CSV形式で出力することもでき、1行ではなく1行ずつ行うことができます。 – Squashman

0

次のコードスニペットは、psinfo -c -d volumeの出力を再フォーマットします。あなたのサンプルデータに応じてドライブタイプ(Fixed)でフィルターをかけたいと思っているので、そのような機能を実装しました。何をフィルタリングしないように、単にset "FILTER="にラインset "FILTER=Fixed"を変更:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FILTER=Fixed" 
(set LF=^ 
%= empty line =% 
) 

for /F "tokens=1,* delims=, eol=," %%K in ('psinfo -c -d volume') do (
    echo(%%K,, 
    set "LINE=%%L" 
    setlocal EnableDelayedExpansion 
    set ^"LINE=!LINE:%%,=%%^%LF%%LF%!^" 
    for /F "delims= eol=," %%E in ("!LINE!") do (
     endlocal 
     if defined FILTER (
      for /F "tokens=2 delims=, eol=," %%F in ("%%E") do (
       if "%%F"=="%FILTER%" (
        echo(,,%%E 
       ) 
      ) 
     ) else (
      echo(,,%%E 
     ) 
     setlocal EnableDelayedExpansion 
    ) 
    endlocal 
) 

endlocal 
exit /B 
関連する問題