我正在尝试将我的旧 BAT 脚本转换为 PowerShell 版本,但在谷歌搜索一小时后,我不知道该怎么做。
我正在寻找一种与旧结构非常相似的结构,找到打开的网络文件,获取它的 PID 并关闭它。
蝙蝠:
for /f "skip=4 tokens=1" %a in ('net files ^| findstr C:\Apps\') do net files %a /close
电源外壳?
我正在尝试将我的旧 BAT 脚本转换为 PowerShell 版本,但在谷歌搜索一小时后,我不知道该怎么做。
我正在寻找一种与旧结构非常相似的结构,找到打开的网络文件,获取它的 PID 并关闭它。
蝙蝠:
for /f "skip=4 tokens=1" %a in ('net files ^| findstr C:\Apps\') do net files %a /close
电源外壳?
这是另一种方式。我喜欢它更多地依赖于流水线,这是 PowerShell 的习惯用法:
net files |
where { $_.Contains( "D:\" ) } |
foreach { $_.Split( ' ' )[0] } |
foreach { net file $_ /close }
Net 文件仍然是您最好的选择。尝试这样的事情:
$results = net file | Select-String -SimpleMatch "C:\Apps\"
foreach ($result in $results) {
#Get id
$id = $result.Line.Split(" ")[0]
#Close file
net file $id /close
}
您可以使用它来查看打开的文件:
$adsi = [adsi]"WinNT://./LanmanServer"
$resources = $adsi.psbase.Invoke("resources") | Foreach-Object {
New-Object PSObject -Property @{
ID = $_.gettype().invokeMember("Name","GetProperty",$null,$_,$null)
Path = $_.gettype().invokeMember("Path","GetProperty",$null,$_,$null)
OpenedBy = $_.gettype().invokeMember("User","GetProperty",$null,$_,$null)
LockCount = $_.gettype().invokeMember("LockCount","GetProperty",$null,$_,$null)
}
}
$resources
然后过滤你要关闭的那些:
$resources | Where-Object { $_.Path -like 'c:\apps\*'} |
Foreach-Object { net files $_.ID /close }
试试这个 :
#capture command output
$openfiles=net files
#parse all lines and watch for c:\apps\
$openfiles| foreach {
if($_ -like '*c:\apps\*'){
#if line contains c:\apps\ split it with space, the first element will be file id
net files $_.split(' ')[0] /close
}
}