Powershell - изо всех сил пытается скопировать файл из переменной местоположения - PullRequest
0 голосов
/ 14 марта 2020

Я бился головой о скрипт PowerShell, с которым я пробовал несколько разных методов, и мне было интересно, может ли кто-нибудь помочь?

Не уверены в этом, если я просто делаю что-то глупое, спасибо заранее

Цель:

Чтобы скопировать файл VBS из домашних дисков пользователя В другом месте расположение VBS-файла меняется в зависимости от того, какой пользователь нуждается в учетной записи администратора, следовательно, это должно быть переменной. Он получает местоположение из текстового файла, который включает точный путь к go и пункт назначения, который уже был создан для копирования файлов.

Где у меня есть проблема в настоящее время:

$location = Get-Content C:\Users\Administrator\Desktop\here\drive4.txt | Out-String
$dest = "C:\Users\Administrator\Desktop\here"
Get-ChildItem -Path $location | 
Copy-Item -Destination $dest -Recurse -Container -filter "peruser.vbs"
write-host $location

Read-Host -Prompt "Press Enter to continue or CTRL+C to quit"

Проблема

Пожалуйста, смотрите ниже, я поставил напишите хост, чтобы показать местоположение, к которому пытается достичь PowerShell. В качестве примечания я могу нормально найти это местоположение через файловый менеджер

Снимок экрана с ошибкой

Ошибка получена

Get-ChildItem : Illegal characters in path.
At C:\Users\Administrator\Desktop\MapNetworkDrives2.ps1:17 char:1
+ Get-ChildItem -Path $location | Copy-Item -Destination $dest -Recurse -Container ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (\\WIN-7V7GI0R7C...             
:String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

Get-ChildItem : Cannot find path '\\WIN-7V7GI0R7CFK\homedrives\Onetest$                                                     

' because it does not exist.
At C:\Users\Administrator\Desktop\MapNetworkDrives2.ps1:17 char:1
+ Get-ChildItem -Path $location | Copy-Item -Destination $dest -Recurse -Container ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\WIN-7V7GI0R7C...             
:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Вы не показываете, что находится в текстовом файле, заставляя нас догадываться, что на самом деле не очень хорошая вещь по отношению к попыткам помочь вам. Итак, я буду считать, что это просто список букв дисков или пути ООН C 's, которая на самом деле спорный вопрос, так как вы не можете вытащить те динамически, таким образом, нет необходимости в файле

1002 * Я не. Я не понимаю, почему вы делаете это ...
Get-Content 'C:\Users\Administrator\Desktop\here\drive4.txt' | 
Out-String

Если это просто текстовый файл для чтения, зачем вам это куда-то пускать?

Вам не нужны двойные кавычки для это. Одинарные кавычки для простой строки, двойные для расширения переменной или другие специфические c требования к форматированию

$dest = 'C:\Users\Adminstrator\Desktop\here'

Просто передайте чтение напрямую

Get-Content 'C:\Users\Administrator\Desktop\here\drive4.txt' | 
ForEach {
    "Processing location $($PSItem.FullName)"
    Copy-Item -Path $PSItem.FullName -Destination $dest -Filter 'peruser.vbs' -Recurse -WhatIf
} 

Примечание: Вам не нужен Write-Host для вывода на экран, так как это по умолчанию PowerShell, как я покажу в следующем примере. На самом деле, кроме написания цветного текста на экране, вам вообще не нужно было бы использовать Write-Host / echo, ну, есть несколько других спецификаций c раз, чтобы использовать его.

Также примечание , относительно Write-Host от изобретателя Monad / PowerShell Джеффри Сновера

Вам также не обязательно нужны оба-Get-ChildItem и Copy-Item, так как оба будут читать рекурсивное дерево папок. Как я покажу ниже. Я использую сплаттинг, чтобы сжать блок кода для удобства чтения.

Итак, если я продемонстрирую это, просто используя диск и папку в моей системе. И пошагово разберитесь со сценарием, чтобы убедиться, что я получаю то, что ожидаю на каждом шаге, прежде чем перейти к следующему.

Get-PSDrive -PSProvider FileSystem | 
Format-Table -AutoSize
<#
# Results

Name Used (GB) Free (GB) Provider   Root  CurrentLocation
---- --------- --------- --------   ----  ---------------
C       357.48    118.83 FileSystem C:\  Windows\system32
D       114.10    362.71 FileSystem D:\           Scripts
E      1194.00    668.89 FileSystem E:\                  
F      3537.07    188.83 FileSystem F:\                  
G                        FileSystem G:\  
#>

# Validate if there is any content in the destination
Try 
{
    Get-PSDrive -PSProvider FileSystem | 
    Where Name -eq 'D' | 
    ForEach {
        "Processing location $($PSItem.Root) and the contents are as listed."
        (Get-ChildItem -Path 'D:\Temp\here' -Recurse).FullName
    }
}
Catch {Write-Warning -Message 'No content in the destination folder'}
<#
# Results

Processing location D:\ and the contents are as listed.
WARNING: No content in the destination folder
#>

# Show what is on the drive for the source files
Get-PSDrive -PSProvider FileSystem | 
Where Name -eq 'D' | 
ForEach{
    "Processing the location $($PSItem.Root)"
    (Get-ChildItem -Path "$($PSItem.Root)\Temp\book1.csv" -Recurse).FullName
}
<#
# Results

Processing the location D:\
D:\Temp\Source\book1.csv
D:\Temp\book1.csv
#>

<#
# Show what will happen if a Copy files from the source to the destination occurs
Using splatting for readability
#>

Get-PSDrive -PSProvider FileSystem | 
Where Name -eq 'D' | 
ForEach{
    "Processing the location $($PSItem.Root)"
    $CopyItemSplat = @{
        Path        = "$($PSItem.Root)\Temp\book1.csv"  
        Destination = "$($PSItem.Root)\Temp\here" 
        Recurse     = $true
        WhatIf      = $true
    }
}
Copy-Item @CopyItemSplat
<#
# Results

Processing the location D:\
What if: Performing the operation "Copy File" on target "Item: D:\Temp\book1.csv Destination: D:\Temp\here\book1.csv".

If the results are as expected, execute the action
Using splatting for readability
#>

Get-PSDrive -PSProvider FileSystem | 
Where Name -eq 'D' | 
ForEach{
    "Processing the location $($PSItem.Root)"
    $CopyItemSplat = @{
        Path        = "$($PSItem.Root)\Temp\book1.csv"  
        Destination = "$($PSItem.Root)\Temp\here" 
        Recurse     = $true
    }
}
Copy-Item @CopyItemSplat
<#
# Results

Processing the location D:\
#>

# Validate if there is any content in the destination
Try 
{
    Get-PSDrive -PSProvider FileSystem | 
    Where Name -eq 'D' | 
    ForEach {
        "Processing location $($PSItem.Root) and the contents are as listed."
        (Get-ChildItem -Path 'D:\Temp\here' -Recurse).FullName
    }
}
Catch {Write-Warning -Message 'No content in the destination folder'}
<#
# Results

Processing location D:\ and the contents are as listed.
D:\Temp\here\book1.csv
#>
0 голосов
/ 14 марта 2020

Если я не понял вас неправильно - вы просто пытаетесь скопировать файл в разные места на основе списка. Если это так, вам просто нужно l oop через ваш список. Это работает для вас?

$location = Get-Content "C:\Users\Administrator\Desktop\here\drive4.txt"
$dest = "C:\Users\Administrator\Desktop\here"

foreach ($loc in $location){
    $vbs = (gci $loc -Filter "peruser.vbs").FullName
    Copy-Item $vbs $dest -Force
}
...