有时候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中国
有时候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参数可能不会接受全部对象。你需要访问一个或两个属性来获得需要的信息。
相关推荐
-
应用PowerShell进行SharePoint Online管理
在应用PowerShell在线管理SharePoint之前,管理员需要进行一系列准备工作,例如下载SharePoint Online Management Shell等。
-
PowerShell管道应用示例
管理人员可以创建一些功能来支持PowerShell管道的运行,而通过脚本将目标对象传递到整个管道中,同样也可以提升基于文本的Shell质量。
-
两种方式将Windows容器部署到微软Azure中
想要创建并管理Windows Server容器吗?本文将会介绍如何利用本地Docker命令和PowerShell模块来实现以上目标。
-
PowerShell脚本示例及管理员参考指南
精明的Windows专业人士和管理员甚至也会做出比卷子袖子干事更加愚笨的事情,为了实现自动化任务,他们需要了解脚本语言以及所有PowerShell工具。