【问题标题】:Removing all Spaces to format output删除所有空格以格式化输出
【发布时间】:2019-06-10 09:53:59
【问题描述】:

我正在使用 powershell 并创建了一个文本文件,该文件会下拉服务器上可用的共享列表。

此文本文件包含许多空格,但我只需删除文件夹名称中的空格,例如Test 2$

理想情况下,我只想删除此空间,使其显示为Test2$。因为我正在尝试创建一个 CSV 以便它可以在另一个脚本中使用。

我复制文本文件并将其重命名为 csv,然后复制该 CSV 的内容并使用空格作为分隔符,然后将结果放入列中,但是当它这样做时,它也会占用多个空格,因此清除所有空格,结果如下所示。

这可能吗?

所以我尝试了以下方法:

-replace " ",""

$_.trim() -ne

两者都删除了所有个空格。但我只需要删除一个。

我当前的代码

##############################################################
#Varibles
##############################################################
$PCs = gc "C:\Temp\Servers\Pc.txt"
$FSText = "C:\Temp\Servers\FileShares.txt"
$FSText2 = "C:\Temp\Servers\FileShares2.txt"
$FSERRORS = "C:\Temp\Servers\Errors.txt"
$FSCSV = "C:\Temp\Servers\Server_Shares.csv"
$FSCSV2 = "C:\Temp\Servers\Server_Shares2.csv"
#############################################################

#############################################################
Function Shares{

$PCs|Foreach-Object{ 

Try{
    $ErrorActionPreference = 'Stop'
    $PC = $_
    Get-WmiObject win32_share -ComputerName $_ | Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},path,name

}
  Catch
 { "Unable to obtain to access to shares on $PC " | Out-file $FSERRORS 
   $ErrorActionPreference ='Continue'
}
}
}
#############################################################

Shares | Out-File $FSText

#############################################################
Function Format{
(GC $FSText) -replace "Server", "" -replace "Path","" -replace "Name","" |Set-Content $FSText
(GC $FSText) | ?{$_.trim() -ne ""} |Set-Content $FSText
(GC $FSText) -replace "\s+" , ";"  | Out-File $FSText 


copy-item $FSText $FSText2

Rename-Item $FSText $FSCSV
Rename-Item $FSText2 $FSText
Import-CSV $FSCSV -Delimiter ';' -header Server,Path,Name| Export-CSV $FSCSV2 -NoClobber -NoTypeInformation -Append
}
#############################################################

Format


#############################################################

文本文件中的结果

------ ---- ---- WKS000001 IPC$ WKS000001 C:\ C$ WKS000001 C:\Temp\Test 测试 WKS000001 C:\Temp\Test 2$ 测试 2$ WKS000001 C:\WINDOWS 管理员$ ------ ---- ---- WKS000002 IPC$ WKS000002 C:\ C$ WKS000002 C:\Windows 管理员$

csv 中的结果

服务器路径名称 ------ ---- ---- WKS000001 IPC$ WKS000001 C:\ C$ WKS000001 C:\Temp\Test 测试 WKS000001 C:\Temp\Test 2$ WKS000001 C:\WINDOWS 管理员$ ------ ---- ---- WKS000002 IPC$ WKS000002 C:\ C$ WKS000002 C:\Windows 管理员$

如您所见,它将 Test 2$ 的路径分成两列,但我需要它在一个列中。

【问题讨论】:

  • 您以错误的方式处理此问题,在将数据保存到 txt 文件之前更新数据会更容易。请更新您的问题以包含您用于创建 txt 文件的代码,以便我们可以看到您在做什么:)
  • 更新代码以反映所要求的内容

标签: powershell


【解决方案1】:

您可以只更新计算的属性,因此替换仅由 Name 属性使用:

Get-WmiObject win32_share -ComputerName $PC | 
    Select-Object -Property @{Name="Server";Expression={$_.__Server}},Path,@{Name="Name";Expression={$_.Name.replace(" ","")}} | 
    Format-Table -AutoSize

会给你输出:

服务器路径名称 ------ ---- ---- WKS000001 IPC$ WKS000001 C:\ C$ WKS000001 C:\Temp\Test 测试 WKS000001 C:\Temp\Test 2$ Test2$ WKS000001 C:\WINDOWS 管理员$

【讨论】:

  • 谢谢,但是我想完全按照它显示的那样制作一个 csv,所以通过将分隔符设置为“”,然后将每列分配一个结果,直到您点击空格并丢失最后一列数据: 查看第三列中缺少 Test2$ 的原因
  • 你没有提到任何关于在你的问题中删除一列数据,只是关于从“文件夹名称”中删除空格......你能否更新你的问题以清楚地解释你真正想要的.显示输入数据的示例以及您希望它如何输出。 cmets 中的代码和/或表格数据无法正常工作,因为它会将其混合到一行中。
  • 根据@James C 的建议,我已经修改了我的问题,以完全反映我想要做的事情。
【解决方案2】:

您已在列中使用计算属性。对路径使用相同的方式。

Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},@{Name="Path";Expression={$_.Path.replace(" ","")}},Name -autosize

但你应该知道C:\MyPath != C:\My Path。要使用带空格的路径,请将它们括在 "' 中。 > 'C:\My Path'
要将路径替换为引号中的路径,您可以使用以下代码:

Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},@{Name="Path";Expression={"'$_.Path'"}},Name -autosize

感谢 James C. 指出使用 .replace() 而不是 .trim()。我忘了.trim() 只适用于字符串开头和结尾的空格,而.replace() 删除了所有空格。

【讨论】:

  • Ups 我误读了您想更改名称列而不是路径。但方式应该是一样的。
  • 感谢 T-ME,但是结果显示如下;如果可能,我想保留原始格式 '\\WKS0001\root\cimv2:Win32_Share.="IPC$".'这可能吗?
  • 对我来说有效:Get-WmiObject win32_share | Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},@{Name="Path";Expression={$_.Path.replace(" ","")}},@{Name="Name";Expression={$_.Name.replace(" ","")}} -autosize(这是一行)
  • 在您将trim() 换成replace() 后工作,提及这可能有助于 OP 意识到您所做的更改,因为它并不明显。
【解决方案3】:

问题的解决方法是使用以下内容;

-替换'\s\s+'

这将删除文本文件中的所有空格,您可以用一个字符替换并在同一字符上定界以创建您的 CSV。

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2016-10-08
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2017-11-03
    • 2018-01-10
    相关资源
    最近更新 更多