Powershell: запись хоста в текущий каталог /$computername

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

Вот текущий код, пишущий в каталог скриптов.

#writing file to 
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath 
Write-Host ("Saving CSV Files at " + [Environment]::CurrentDirectory + " Named the following.")
Write-Host $PritnersFilename

Я пытался добавить $ ComputerName в разные места, но безуспешно.

Примеры:

Write-Host ("Saving CSV Files at " + [Environment]::CurrentDirectory\$ComputerName + " Named the following.")
Write-Host ("Saving CSV Files at " + [Environment]::(CurrentDirectory\$ComputerName) + " Named the following.")

РЕДАКТИРОВАТЬ: $ComputerName является переменной целевого, а не локального хоста

2 ответа

Было бы проще, если бы я увидел весь код. Но я привел пример, потому что я чувствовал, что было бы легче объяснить это так, потому что я не знаю, откуда вы берете свои переменные.

Довольно просто, он проходит по компьютерам и, если в текущей папке нет папки с именем $computername, он создает ее. Затем приходит ваш код экспорта, где он экспортирует данные компьютера в ту папку, которую мы только что создали.

Ключевая часть: использование ".\" - то же самое, что и текущая папка.

cd C:\Scriptfolder\

# computer variables for example
$computers = @()
$computers += "HOST1"
$computers += "HOST2"
$computers += "HOST3"

# looping through all objects
Foreach($computer in $computers){

    # creating folder named after computername if one doesn't exist
    if(!(Test-Path ".\$computer")){
        New-Item -ItemType Directory -Name $computer -Path ".\"
    }
    # output path with computername in it
    $outputpath = ".\$computer\output.csv"

    # your export code
    $computer | Export-CSV $outputpath
}

[Environment]::CurrentDirectory\$ComputerName из-за нахождения внутри (...) и используется в качестве операнда + оператор, анализируется в режиме выражения, что вызывает синтаксическую ошибку.

Обзор режимов синтаксического анализа PowerShell см. В моем ответе.

Тебе нужно "..." (расширяемая строка) для выполнения конкатенации строк с использованием оператора подвыражения $(...) встраивать выражение [Environment]::CurrentDirectory и встраивание ссылки на переменную $ComputerName непосредственно.

"$([Environment]::CurrentDirectory)\$ComputerName"

Для обзора расширения строк (интерполяции строк) в PowerShell см. Мой ответ.

В качестве альтернативы, вы можете использовать выражение с + а также (или даже смешать два подхода):

# Enclose the whole expression in (...) if you want to use it as a command argument.
[Environment]::CurrentDirectory + '\' + $ComputerName

Примечание. Самый надежный (хотя и более медленный) метод построения путей к файловой системе - это использование Join-Path командлет:

# Enclose the whole command in (...) to use it as part of an expression.
Join-Path ([Environment]::CurrentDirectory) $ComputerName

Обратите внимание на необходимость (...) вокруг [Environment]::CurrentDirectory чтобы убедиться, что он распознается как выражение. В противном случае, поскольку команда анализируется в режиме аргумента, [Environment]::CurrentDirectory будет рассматриваться как буквальный.

Другие вопросы по тегам