如何解决访问文件时遇到的PowerShell错误

日期: 2012-10-22 作者:Don Jones翻译:杨旭 来源:TechTarget中国 英文

有时候PowerShell会在访问文件时出现错误。这跟设置的PowerShell访问文件方式无关。这里有一小段代码,可以说明哪里出错了:   $files = Get-ChildItem c:mydirectory -File  foreach ($file in $files) {   $content = Get-Content $file   $content –replace ‘x’,’y’   $content | Set-Content $file  }   命令的目的是将文本文件中的所有“x”替换为“y”,这些文本文件存放在C:My……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

有时候PowerShell会在访问文件时出现错误。这跟设置的PowerShell访问文件方式无关。这里有一小段代码,可以说明哪里出错了:

  $files = Get-ChildItem c:mydirectory -File
  foreach ($file in $files) {
   $content = Get-Content $file
   $content –replace 'x','y'
   $content | Set-Content $file
  }

  命令的目的是将文本文件中的所有“x”替换为“y”,这些文本文件存放在C:MyDirectory。假设此路径下的所有文件都是.txt格式,并且针对所有的文件执行此命令。

  下面中的第一个错误:

  $content = Get-Content $file

  $file针对所有文档文件,不是单个文件。而Get-Content至返回一个文件名称。

  解释完这个问题,我想在Powershell中解决这个错误:通过Write-Verbose添加脚本,调试output窗口:

  $VerbosePreference = 'Continue'
  $files = Get-ChildItem c:mydirectory -File
  foreach ($file in $files) {
  Write-Verbose "the file name is $file"
  $content = Get-Content $file
  $content –replace 'x','y'
  $content | Set-Content $file
  }

  继续执行。将C:MyDirectory文件夹名称改成适合系统的并在文件夹中添加两个测试文本并运行。Output窗口立马显示$file并不仅仅包含一个简单的文件名称。$file是一个重要和复杂的对象,包含很多属性,其中有Name属性。

  你可能要想,“嗯,这里是解决方法”并运行下面的代码:

  $VerbosePreference = 'Continue'
  $files = Get-ChildItem c:mydirectory -File
  foreach ($file in $files) {
   Write-Verbose "the file name is $($file.name)"
   $content = Get-Content $file.name
   $content –replace 'x','y'
   $content | Set-Content $file.name
  }

  实际上,这个是有用的。但问题是,Get-Content和Set-Content命令都需要不止一个文件名称,他们需要文件的绝对地址。如果你运行C:MyDirectory路径下的文件脚本,这个方法是没问题的。如果从其他路径运行脚本,Get-Content不能查找到文件,并会产生PowerShell错误。

  这时候最好后退一步,试着运行这个:

  Dir c:mydirectory | Format-List *

  目的是为了查看$file变量是否有效,包含什么有效属性和什么类型的数据。Fullname属性提供文件的完整路径?或者你需要添加一些路径和名称的组合吗?不要猜想,基于事实,修正你的脚本。

  与其告诉你答案,不如你自己看看是否搞定了。假设最后一个命令指向一个有效的目录,其中包含有效的文件,是解决这一问题的关键。

  如果事实证明连接是正确的,避免在PowerShell中使用+操作符:

  $name = $file.path + '' + $file.name

  我发现很难读懂,大部分人也一样。因此,依靠PowerShell的神奇的双引号和子表达式:

  $name = "$($file.path)$($file.name)"

  一对双引号,两个$(表达式),你已经完成了。可能不是容易阅读,但它利用了PowerShell中很酷的特性。

  这实际上是让大家记住,大部分PowerShell命令产生对象作为output。另一方面,一条命令的input参数可能不会接受全部对象。你需要访问一个或两个属性来获得需要的信息。

作者

Don Jones
Don Jones

投稿作者

相关推荐