【问题标题】:Where are CSV files saved?CSV 文件保存在哪里?
【发布时间】:2014-11-17 21:06:34
【问题描述】:

所以在 PowerShell 中,我终于弄清楚了如何读取两个变量、执行 WMI 查询以及将三个变量写入 CSV 文件。我希望在当前工作目录中创建导出的 csv 文件,但我在 C:\Windows\system32 中找到它。我相信这些是我的代码中的相关行;如果您需要更多信息,请告诉我:

$resultfile = ".\Check-Results.csv"
$csv = "<$server>,<$service>,<$status>`r`n"
<ping check, foreach loop, wmi query here, etc...>
$csv +=$server + "," + $service + "," + $status + "`r`n"
$fso = New-Object -ComObject scripting.filesystemobject
$file = $fso.CreateTextFile($resultfile,$true)
$file.write($csv)
$file.close()

我的理解是点斜杠将是在 PWD 中获取结果文件所需的全部内容,但我猜不是。顺便说一句,我的脚本必须兼容 PS 2.0,所以我不能只执行 Export-CSV -append。

对于 alroc:我的脚本正在做的是使用 Import-CSV 从 csv 文件中获取服务器名称和 PortWWN。然后我在 foreach 循环中遍历服务器列表以查询 WMI 以查找与 PortWWN 匹配的 Emulex 端口,然后提取端口状态(链路关闭、操作等)

所以我从 Import-CSV 中的两个变量 $server 和 $wwn 开始,并以三个变量 $server、$wwn 和 $status 结束。这三个变量需要写入一个新的 CSV 文件。我知道 PS 2.0 有 Export-CSV,但它没有 -append 参数——这是 3.0 的功能。所以我早期的结果只显示了循环中的最后一个结果。

我从The Scripting Guy 获得了 fsobjects 的想法,并且很高兴看到结果完美运行,除了文件不在我预期的位置。这个脚本必须由相对缺乏经验的 PS 用户运行,所以它必须是相当安全的。他们会将脚本和源 CSV 文件复制到装有 PS 2.0 的计算机上,运行脚本,然后查看结果文件,我希望所有内容都在一个地方。

【问题讨论】:

  • 我对 PowerShell 知之甚少,但我认为那是 PWD,您需要更改它:Managing Current Location。或者明确给出路径而不是使用`.`。
  • 忘记使用 COM 对象在 PowerShell 中处理文件。你有 get-content、set-content 等等。

标签: powershell csv


【解决方案1】:

你说得对,点斜杠会使其保存在当前工作目录中。每个进程都有一个当前工作目录,powershell 没有什么不同,因此要查看它的“真实”当前工作目录,您可以执行以下操作:

Write-Host ([System.Environment]::CurrentDirectory)

但是 Powershell 的特殊之处在于您在提示符处看到的位置是当前提供程序的位置。这就是为什么如果你输入类似的内容:

cd cert:

您将收到以下提示:

PS Cert:\>

此“cert:\”驱动器不是“真实”位置,因此不可能设置为进程的当前工作目录。这就是为什么 powershell 有它自己的(位置)以及它的进程当前工作目录,尽管你只看到前者。

Cmdlet 通常设计为使用 powershell 的位置,但如果您直接使用 .NET 类或调用第三方程序,则当前工作目录将是 powershell 进程的目录。如果您想知道 CSV 的保存位置,请将以下内容添加到您的脚本中:

Write-Host ([System.Environment]::CurrentDirectory)

或者,如果您当前的 powershell 位置是一个实际的文件系统位置,那么您可以使用以下命令将进程当前工作目录设置为 powershell 的位置:

[System.Environment]::CurrentDirectory = Get-Location

【讨论】:

  • 谢谢你,DanL。就是这样。我的 ISE 的密码设置为 windows\system32,我的控制台的密码设置为网络共享。我不知道。
  • 在我的脚本顶部,我添加了您对 [System.Environment]::CurrentDirectory = Get-Location 的建议,最后显示了用户查找结果文件的目录。完美!
【解决方案2】:

如果您从批处理文件调用 PowerShell,它通常会从 C:\Windows\System32\ 开始,因为那是 cmd.exe 所在的位置。

要将位置设置为正在运行的脚本文件所在的位置,您可以使用以下命令:

Set-Location $script:MyInvocation.MyCommand.Path

如果这在 PowerShell 2.0 中不起作用,请尝试:

Set-Location $MyInvocation.MyCommand.Path

查看Get-Help about_Automatic_Variables 了解更多信息。那是 PowerShell 4.0,但它与 2.0 非常相似,我找不到旧的 2.0 参考。

【讨论】:

    【解决方案3】:

    CSV 文件保存在您告诉脚本保存它们的任何位置。在这种情况下,它将是您运行脚本的当前工作目录中的一个文件。

    但是,您正在编写 CSV,就好像它是 VBScript。你应该写 The PowerShell Way(tm)。它会更快、更干净、更容易阅读。不幸的是,我不能给你具体的建议,因为你没有展示你的脚本正在做什么的细节,但你可能想要创建一个自定义的 PSObject 包含你执行到的 cmdlet 的结果获取您的 ping 和 WMI 数据(将不是是您当前使用的方法),然后使用 export-csv 输出(在 PowerShell 2.0 中,因此您已被覆盖)。

    如果你坚持你现在正在做的事情,你的输出应该通过以下(而不是 FSO):

    Set-Content -path $resultfile -force -value $csv
    

    【讨论】:

    • alroc,很公平。当我指定点斜杠时,我认为该文件会保存在 pwd 中,但这并没有发生。我会在我的问题中添加更多内容。
    • 如有疑问,请指定完整的绝对路径。或者从已知的环境变量开始。
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2012-09-01
    相关资源
    最近更新 更多