Ошибка Set-Content: процесс не может получить доступ к файлу, поскольку он используется другим процессом (Powershell) - PullRequest
0 голосов
/ 27 декабря 2018

Здесь я пытаюсь удалить все общие папки на моем компьютере, кроме папок по умолчанию, которые я удаляю с одним пробелом перед циклом.Это работало в течение приблизительно 10 минут, когда все я внезапно получаю сообщение об ошибке, говорящее, что моя команда Set-Content не будет выполнена, потому что "она используется другим процессом".Есть идеи?Заранее спасибо!

Примечание: Я знаю, что net share %%s /delete отражено.Я просто хотел посмотреть, что будет удалено, прежде чем я на самом деле приведу его в действие.

DeletingSharedFiles.bat:

set /p name= "Name of the Admin user  |  "
net share> "C:\Users\%name%\Desktop\SharedFiles.txt"

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command 
"C:\Users\%name%\Desktop\SharedFiles.ps1"

for /f "tokens=1" %%s in (C:\Users\%name%\Desktop\SharedFiles.txt) do(
    echo net share %%s /delete  
)

SharedFiles.ps1

(Get-Content "C:\Users\$env:name\Desktop\SharedFiles.txt") | 
Foreach-Object {$_ -replace "ADMIN\$", ""} | 
Foreach-Object {$_ -replace "C\$", ""} | 
Foreach-Object {$_ -replace "IPC\$", ""} |  
Set-Content "C:\Users\$env:name\Desktop\SharedFiles.txt" 

Выход DeletingSharedFiles.bat

Set-Content : The process cannot access the file 
'C:\Users\Sebastian\Desktop\SharedFiles.txt' because it is being used
by another process.
At C:\Users\Sebastian\Desktop\SharedFiles.ps1:5 char:1
+ Set-Content "C:\Users\$env:name\Desktop\SharedFiles.txt"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo: NotSpecified: (:) [Set-Content], IOException
    + FullyQualifiedErrorId : 
System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand

1 Ответ

0 голосов
/ 27 декабря 2018

Вы слишком усложняете вещи:

  • Абсолютно не требуется временный файл, ни в пакетном режиме, ни в PowerShell.
  • для удаления общих ресурсов, которые должны остаться из вывода, используйте findstr / v
  • for /f по умолчанию имеет tokens=1, это не должно быть выражено.

Таким образом, одна строка cmd должна делать:

for /f %A in ('net share ^| findstr /IV "^Admin\$ ^C\$ ^IPC\$" ^| findstr ":\\"') do @Echo net share %A /del

или в пакетном файле:

@Echo off
for /f %%A in (
    'net share ^| findstr /IV "^Admin\$ ^C\$ ^IPC\$" ^| findstr ":\\"'
) do Echo net share %%A /del

Сценарий PowerShell для выполнения полной задачи (требуется Win10):

Get-SmbShare | Where-Object Name -notmatch "^Admin\$|^C\$|^IPC\$" | Remove-SMBShare -WhatIf

Ваш Powershellscript можно упростить:

(Get-Content "C:\Users\$env:name\Desktop\SharedFiles.txt") -replace "^ADMIN\$|^C\$|^IPC\$" |  
Set-Content "C:\Users\$env:name\Desktop\SharedFiles.txt" 

Но имейте в виду, что при удалении этих имен общих ресурсов for /f в ваш пакет будет игнорировать ведущие разделители и затем принимать имя ресурса /описание как 1-й жетон.


Всего здесь смешанный пакетный / PowerShell скрипт не является ни полезным, ни необходимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...