Search code examples
powershellstring-interpolationpowershell-cmdlet

Creating PowerShell File Using New-Item & Add-Content Cmdlets


This is the first time posting on SO (and really on any public platform), so I apologize if this question was already answered or if the question isn't structured appropriately.

I am brand new to creating PowerShell Scripts and I'm hoping someone can assist me on my new scripting adventure!

The script I am trying to create is to gather user input on OS user credentials, the OS user password, and the remote server's IP Address\FQDN\Hostname. From there I want to create a ps1 file that a scheduled task will point to, which will copy a particular folder from one server to a remote server on a daily basis (replacing the remote servers folder). I am getting caught up on properly adding the needed lines using the New-Item and Add-Content cmdlets

Here is my script I created so far:

#Clear the Screen
Clear-Host

#Create Variable for OS User Account
$User = read-host "What is the OS User that has permissions to the remote web server?"

#Clear the Screen
Clear-Host

#Password for OS User Account
$Password = Read-Host "What is the password of the OS account that has permissions to the remote web server?"

#Clear the Screen
Clear-Host

#Convert Password String
$PWord = ConvertTo-SecureString -String $Password -AsPlainText -Force

#Combine User Name and Password into One Entity
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord

#IP Address of Destination ICA Web Server
$DestServer = Read-Host "What is the IP address\FQDN\Hostname of the Destination Web Server"

#Create a PowerShell File that will be used for Task Scheduler
New-Item "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" -ItemType File -Force -Value "$PWord = ConvertTo-SecureString -String $Password -AsPlainText -Force"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" ""
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" ""
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "$Session = New-PSSession -ComputerName $DestServer -Credential $Credential"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "Copy-Item `"C:\Web\Web\Download`" -Destination `"C:\Web\Web\`" -ToSession $Session -Recurse -Force"

This is the results that I get in the ps1 that gets created (Used 'TestUser' for the OS user, 'PW' for the password, and '10.10.10.10' for the remote server):

System.Security.SecureString = ConvertTo-SecureString -String PW -AsPlainText -Force
System.Management.Automation.PSCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList TestUser, System.Security.SecureString

 = New-PSSession -ComputerName 10.10.10.10 -Credential System.Management.Automation.PSCredential
Copy-Item "C:\Web\Web\Download" -Destination "C:\Web\Web\" -ToSession  -Recurse -Force

On the first line, for some reason it displays 'System.Security.SecureString' rather than the $PWord variable.

The second line displays 'System.Management.Automation.PSCredential' & System.Security.SecureString rather than the $Credential & $PWord variables.

The third line does not display the $Session variable. It also displays 'System.Management.Automation.PSCredential' rather than the $Credential variable.

The fourth line does not display the $Session variable

So it looks like Powershell doesn't like me adding variables using the New-Item & Add-Content cmdlets.

Any input/suggestions is greatly appreciated!! Thank you!

UPDATE: Thank you, mklement0, for providing the missing piece to my puzzle!

Here is an updated working script based off the information provided by mklement0

#Clear the Screen
Clear-Host

#Create Variable for OS User Account
$User = read-host "What is the OS user account that has permissions to the remote web server?"

#Clear the Screen
Clear-Host

#Password for OS User Account
$Password = Read-Host "What is the password of the OS user account that has permissions to the remote web server?"

#Clear the Screen
Clear-Host

#Convert Password String
$PWord = ConvertTo-SecureString -String $Password -AsPlainText -Force

#Combine User Name and Password into One Entity
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord

#IP Address of Destination ICA Web Server
$DestServer = Read-Host "What is the IP address, FQDN, or Hostname of the remote web server"

#Create a PowerShell File that will be used for Task Scheduler
New-Item "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" -ItemType File -Force -Value "`$OSUser = `"$User`""
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" ""
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "`$PWord = ConvertTo-SecureString -String `"$Password`" -AsPlainText -Force"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "`$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList `$OSUser, `$PWord"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" ""
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "`$Session = New-PSSession -ComputerName `"$DestServer`" -Credential `$Credential"
Add-Content "C:\Test\ScheduledTask\CopyPasteDownLoadFolder.ps1" "Copy-Item `"C:\Web\Web\Download`" -Destination `"C:\Web\Web\`" -ToSession `$Session -Recurse -Force"

Solution

  • $ characters that you want to retain as-is inside an expandable (double-quoted) string ("...") must be escaped as `$, otherwise they and what follows are subject to string interpolation; e.g.:

    $foo = 'bar'
    
    # Note the ` (backtick) before the first $, which escapes it.
    # The second $foo, which is unescaped is expanded (interpolated).
    "Variable `$foo contains $foo"
    

    The above yields verbatim:

    Variable $foo contains bar
    

    In cases where you don't need expansion (string interpolation) at all, use '...' quoting instead, i.e. an verbatim (single-quoted) string ; e.g.:

    '$ needs no escaping here, the following is kept as-is: $foo, $(1+2).'